C 普通计数求调
查看原帖
C 普通计数求调
857626
_RainCappuccino_楼主2025/1/4 21:45

赛时靠数位 dp 过的……

因为这个做法吃了两发罚时

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int , int> pi;
#define endl '\n'
#define int long long
const int N = 2e5 + 10;
int n;
ll l , r;
ll getx(ll x) {
    if (x < 10) return x + 1;
    ll res = 0;
    // cout << x << endl;
    int p = 0;
    for (ll w = 1; w <= x && p <= 18; w *= 10) {
        for (int i = 1; i <= 9; i++) {
            if (i * w > x) continue;
            if ((i + 1) * w > x) {
                ll lst = x - i * w, tot = 0;
                vector<int> num;
                while (lst) num.push_back(lst % 10), lst /= 10;
                reverse(num.begin(), num.end());
                tot = num.size() - 1;
                for (auto u : num) {
                    // cout << u << ' ' << res << endl;
                    if (u < i) {
                        for (int v = 0; v < u + (tot == 0); v ++) res += pow(i, tot);
                    } else {
                        for (int v = 0; v < i; v ++) res += pow(i, tot);
                        break;
                    }
                    tot --;
                }
            } else {
                res += pow(i , p);
            }
            // cout << i << ' ' << res << endl;
        }
        p++;
    }
    return res;
}

signed main() {
    ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0);
    cin >> l >> r;
    cout << getx(r) - getx(l - 1) << endl;
    return 0;
}
2025/1/4 21:45
加载中...