QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#573167 | #2519. Number with Bachelors | LCat90 | AC ✓ | 238ms | 26640kb | C++14 | 3.1kb | 2024-09-18 17:34:43 | 2024-09-18 17:34:46 |
Judging History
answer
//
#include <bits/stdc++.h>
using namespace std;
const int maxn = (1 << 16) + 10;
typedef unsigned long long ull;
ull dp[2][22][maxn];
int type, a[100];
ull dfs(int pos, int sta, int limit) {
if (pos == -1)
return 1;
int ty = (type == 10) ? 0 : 1;
if (dp[ty][pos][sta] != -1 && !limit)
return dp[ty][pos][sta];
int up = limit ? a[pos] : type - 1;
ull ans = 0;
for (int i = 0; i <= up; i++) {
if ((sta >> i) & 1)
continue;
if (sta == 0 && i == 0)
ans += dfs(pos - 1, sta, limit && i == up);
else
ans += dfs(pos - 1, sta | (1 << i), limit && i == up);
}
if (!limit)
dp[ty][pos][sta] = ans;
// printf("pos = %d sta = %d limit = %d ans = %llu\n", pos,sta,limit,ans);
return ans;
}
ull solve(ull x) {
int pos = 0;
while (x) {
a[pos++] = x % type;
x /= type;
}
return dfs(pos - 1, 0, true);
}
void input(ull &x) {
x = 0;
char s[22];
scanf("%s", s + 1);
int len = strlen(s + 1);
for (int i = 1; i <= len; i++) {
if (s[i] <= '9' && s[i] >= '0')
x = x * type + s[i] - '0';
else
x = x * type + s[i] - 'a' + 10;
}
}
void print(ull x) {
if (x == 0) {
printf("0\n");
return;
}
if (type == 10)
printf("%llu\n", x);
else {
vector<int> ans;
while (x) {
int p = x % type;
x /= type;
ans.push_back(p);
}
for (int i = ans.size() - 1; i >= 0; i--) {
if (ans[i] >= 10)
printf("%c", ans[i] - 10 + 'a');
else
printf("%c", ans[i] + '0');
}
printf("\n");
}
}
void test() {
int t;
scanf("%d", &t);
while (t--) {
int x;
scanf("%d%d", &x, &type);
printf("%llu", solve(x));
}
}
int main() {
memset(dp, -1, sizeof(dp));
// test();
int T;
scanf("%d", &T);
while (T--) {
char op[10];
scanf("%s", op);
if (op[0] == 'd')
type = 10;
else
type = 16;
int flag;
scanf("%d", &flag);
if (!flag) {
ull a, b;
input(a), input(b);
// printf("ss a = %llu b = %llu\n", a,b);
ull ans = solve(b);
if (a > 0)
ans -= solve(a - 1);
print(ans);
} else {
ull x;
input(x);
if (x < 10) {
printf("%llu\n", x - 1);
continue;
}
ull l = 0, r = 0, ans = 0;
r--;
if (solve(r) < x) {
printf("-\n");
continue;
}
while (l <= r) {
ull mid = l + (r - l) / 2;
if (solve(mid) >= x)
r = mid - 1, ans = mid;
else
l = mid + 1;
}
print(ans);
}
}
}
/*
逆天题,tmd 就是屎中式
*/
详细
Test #1:
score: 100
Accepted
time: 43ms
memory: 26608kb
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 9 e - -
result:
ok 6 lines
Test #2:
score: 0
Accepted
time: 238ms
memory: 26640kb
input:
50000 h 1 147a d 0 25 71 d 1 3587 d 0 26922 51887 d 1 711 d 0 3 5 h 0 7bf2defab442a0b1 f299a4cf1d4d9bed d 0 6961 91018 d 1 4 d 1 876 h 1 12cc5d3370f99120 d 1 161315 h 0 25f 6959 d 0 467 516 d 1 298 h 1 70260cdc2da73281 h 1 928e17d65d764ca2 h 1 c8ec8a7b67605e51 d 1 91697 d 0 4941925161850941148 89850...
output:
1b36 43 6587 7710 953 3 8daab378500 26054 3 1356 - 946307 4681 40 387 - - - 491850 0 1 29 - 4605298 1 1 - 15b4 175f 9b944134000 124b7 6279 9 6257 - 39be22a900 5c636b59300 146ce 2a55 - 0 - 7 d 6 2041 - 1c94afe7300 0 5 9149 16540973 1389 125 0 - 3bc31189480 424 66800 7 - - 1e6 0 0 48b6 9 - 2b0 5019 14...
result:
ok 50000 lines