abc f 求调
  • 板块学术版
  • 楼主TernaryTree
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/25 21:51
  • 上次更新2023/10/23 20:29:24
查看原帖
abc f 求调
362750
TernaryTree楼主2023/3/25 21:51
#include <bits/stdc++.h>
#define int long long

using namespace std;

int t;
int n;
string s;
int l, r;
int ql, qr;
int num[20], cnt;
int dp[20];
bool flag = true;

int dfs(int pos, int lim, bool zer) {
    if (pos == 0) return !zer;
    if (!lim && !zer && ~dp[pos]) return dp[pos];
    int to = lim ? num[pos] : 9, ans = 0;
    if (qr <= pos && pos <= ql) {
        int cur = s[n - pos + qr - 1] - '0';
        if (lim && cur > to) return 0;
        ans = dfs(pos - 1, lim && (cur == to), zer && cur == 0);
    } else {
        for (int i = 0; i <= to; i++) {
            ans += dfs(pos - 1, lim && (i == to), zer && i == 0);
        }
    }
    if (!lim && !zer) {
        dp[pos] = ans;
    }
    return ans;
}

int solve(int x) {
    memset(num, 0, sizeof(num));
    cnt = 0;
    if (x == 0) cnt = 1;
    while (x) {
        num[++cnt] = x % 10;
        x /= 10;
    }
    int ans = 0;
    for (int i = 1; i + n - 1 <= (s[0] == '0' ? cnt - 1 : cnt); i++) {
        memset(dp, -1, sizeof(dp));
        qr = i, ql = i + n - 1;
        int tmp = dfs(cnt, 1, 1);
        // cout << qr << " " << ql << " " << tmp << endl;
        ans += tmp;
    }
    return ans;
}  

signed main() {
    cin >> t;
    while (t--) {
        cin >> s >> l >> r;
        n = s.length();
        if (n > 16) {
            puts("0");
            continue;
        }
        flag = true;
        for (int i = 0; i < n; i++) {
            if (s[i] != '0') {
                flag = false;
                break;
            }
        }
        cout << solve(r) - solve(l - 1) << endl;
    }
    return 0;
}
2023/3/25 21:51
加载中...