95Pts,WA on #18,看信息应该是输出 0,我的输出了 2。
思路就是建两个数组,一个存储当前的方案数,另一个存储当前数位和。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 20;
const int Mod = 1e9 + 7;
int t;
int z[N];
int f[N][2];
int g[N][2];
int dp(int num) {
int n = 0;
while (num) {
z[++n] = num % 10;
num /= 10;
}
memset(f, 0, sizeof f);
memset(g, 0, sizeof g);
f[n + 1][1] = 1;
for (int i = n;i >= 1;--i) {
for (int j = 0;j < 2;++j) {
int up = 9;
if (j == 1) {
up = z[i];
}
for (int k = 0;k <= up;++k) {
(f[i][(j == 1) && (k == up)] += f[i + 1][j]) %= Mod;
(g[i][(j == 1) && (k == up)] += f[i + 1][j] * k % Mod + g[i + 1][j]) %= Mod;
}
}
}
return (g[1][0] + g[1][1]) % Mod;
}
signed main() {
cin >> t;
while (t--) {
int l, r;
cin >> l >> r;
cout << ((dp(r) - dp(l - 1)) % Mod + Mod) % Mod << "\n";
}
return 0;
}