求调,判重后答案貌似变少了
查看原帖
求调,判重后答案貌似变少了
1050431
DevilsFlame楼主2025/7/22 13:08

如果可以的话求hack,样例已过

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 1e2;
int a,b,T,p[10] = {0,1,10,100,1000,10000,100000,1000000,10000000};
short int g[N];
bool vis[N];
queue <int> q;
inline void read(int &x) {
    x = 0;
    char s = getchar();
    while(s < '0' || s > '9') s = getchar();
    while(s >= '0' && s <= '9') {
        x = x * 10 + s - 48;
        s = getchar();
    }
    return;
}
inline long long query(int x) {
    int k,gg = g[x];
    long long ans = 0;
    for(int i = 2;i <= gg;i ++) {
        k = p[i];
        int c = x % k;
        int l = x / k + p[g[x / k] + 1] * c;//变化后的数
        if(l > x && l <= b && !vis[l]) ans ++,vis[l] = 1,q.push(l);
    }
    while(!q.empty()) {
        vis[q.front()] = 0;
        q.pop();
    }
    return ans;
}
int main() {
    read(T);
    g[1] = g[2] = g[3] = g[4] = g[5] = g[6] = g[7] = g[8] = g[9] = 1;
    for(int i = 10;i <= 1e6;i ++) g[i] = g[i / 10] + 1;
    for(int t = 1;t <= T;t ++) {
        read(a),read(b);
        long long ans = 0;
        for(int i = max(a,10);i <= b;i ++) ans += query(i);
        printf("Case #%d: %lld\n",t,ans);
    }
    return 0;
}
2025/7/22 13:08
加载中...