QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#718125#2519. Number with Bachelorsyuto1115#WA 0ms3796kbC++202.1kb2024-11-06 19:46:182024-11-06 19:46:22

Judging History

你现在查看的是最新测评结果

  • [2024-11-06 19:46:22]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3796kb
  • [2024-11-06 19:46:18]
  • 提交

answer

#include <cstdio>
#include <cstring>
#include <vector>

const int N = 25;
int n, base[2] = {10, 16};
unsigned long long dp[N][N], leqlen[N][N];

int fromchar(char c) {
	if (c <= '9' && c >= '0') return c - '0';
	else return c - 'a' + 10;
}

char tochar(int c) {
	if (c >= 10) return 'a' + c - 10;
	return '0' + c;
}

void outhex(long long x) {
	std::vector<int> repr;
	while (x) {
		repr.push_back(x % 16);
		x /= 16;
	}
	for (int i = (int)repr.size() - 1; i >= 0; --i) {
		int c = repr[i];
		if (c < 10) printf("%d", c);
		else printf("%c\n", 'a' + c - 10);
	}
}

long long readhex() {
	char s[N];
	scanf("%s", s);
	long long r = 0;
	for (int i = 0; s[i]; ++i) {
		r *= 16;
		r += fromchar(s[i]);
	}
	return r;
}

long long f(char *s, int b, bool last) {
	bool u[N] = {0};
	int len = strlen(s), avail = base[b];
	long long ans = leqlen[len - 1][avail];
	for (int i = 0; s[i]; ++i) {
		int c = fromchar(s[i]);
		for (int j = 0 + (!i); j < c; ++j) if (!u[j]) ans += dp[len - i - 1][avail - i - 1];
		if (u[c]) return ans;
		u[c] = true;
	}
	return ans + last;
}

void solve(long long ind, bool b) {
	int len, avail = base[b];
	--ind;
	for (len = 0; len < N && leqlen[len][avail] <= ind; ++len);
	if (len == N) printf("-\n");
	else {
		ind -= leqlen[len - 1][avail];
		bool u[N] = {0};
		for (int i = 0; i < len; ++i) {
			int j = 0;
			if (!i) ++j;
			--avail;
			for (; dp[len - i - 1][avail] <= ind; ++j) {
				if (!u[j]) ind -= dp[len - i - 1][avail];
			}
			while (u[j]) ++j;
			printf("%c", tochar(j));
			u[j] = 1;
		}
		printf("\n");
	}
}

int main() {
	for (int i = 0; i < N; ++i) {
		for (int j = i; j < N; ++j) {
			if (!i) dp[i][j] = 1;
			else {
				dp[i][j] = j * dp[i - 1][j - 1];
				leqlen[i][j] = leqlen[i - 1][j] + dp[i - 1][j - 1] * (j - 1) + (i == 1);
			}
		}
	}
	scanf("%d", &n);
	while (n--) {
		int type;
		char b;
		scanf(" %c%d", &b, &type);
		b = b == 'd' ? 0 : 1;
		if (type == 0) {
			char l[N], r[N];
			scanf("%s%s", l, r);
			long long ans = f(r, b, 1) - f(l, b, 0);
			if (b == 1) outhex(ans);
			else printf("%lld\n", ans);
		} else {
			long long ind;
			if (b == 1) ind = readhex();
			else scanf("%lld", &ind);
			solve(ind, b);
		}
	}
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3796kb

input:

6
d 0 10 20
h 0 10 1f
d 1 10
h 1 f
d 1 1000000000
h 1 ffffffffffffffff

output:

10
f
a
f
-
-

result:

wrong answer 3rd lines differ - expected: '9', found: 'a'