QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#573167#2519. Number with BachelorsLCat90AC ✓238ms26640kbC++143.1kb2024-09-18 17:34:432024-09-18 17:34:46

Judging History

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

  • [2024-09-18 17:34:46]
  • 评测
  • 测评结果:AC
  • 用时:238ms
  • 内存:26640kb
  • [2024-09-18 17:34:43]
  • 提交

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