不要666升级版
∑ ( p r e + s u c ) 2 n × p r e 2 + 2 × p r e ∑ s u c + ∑ s u c 2 \sum(pre + suc) ^ 2\\ n \times pre ^ 2 + 2 \times pre \sum suc + \sum suc ^ 2\\ ∑(pre+suc)2n×pre2+2×pre∑suc+∑suc2
∑ ( p r e + s u c ) 3 ∑ ( p r e 3 + 3 × p r e 2 × s u c + 3 × p r e × s u c 2 + s u c 3 ) n × p r e 3 + 3 × p r e 2 ∑ s u c + 3 × p r e ∑ s u c 2 + ∑ s u c 3 \sum (pre + suc) ^ 3\\ \sum \left(pre ^ 3 + 3 \times pre ^ 2 \times suc + 3 \times pre \times suc ^ 2 + suc ^ 3\right)\\ n \times pre ^ 3 + 3 \times pre ^ 2 \sum suc + 3 \times pre \sum suc ^ 2 + \sum suc ^ 3\\ ∑(pre+suc)3∑(pre3+3×pre2×suc+3×pre×suc2+suc3)n×pre3+3×pre2∑suc+3×pre∑suc2+∑suc3
由此维护 n , s u m , s u m 2 , s u m 3 n, sum, sum^ 2, sum ^ 3 n,sum,sum2,sum3即可,定义 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k],为枚举到第 i i i为,数位和为 j j j,数字余 k k k的状态,记忆化搜索即可。
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
inline int add(int x, int y) {
return x + y < mod ? x + y : x + y - mod;
}
inline int sub(int x, int y) {
return x >= y ? x - y : x - y + mod;
}
int cnt, num[20], p[20];
struct Res {
int cnt = -1, sum1, sum2, sum3;
}f[20][10][10];
Res dfs(int pos, int sum, int remain, int flag) {
if (!pos) {
if (sum != 0 && remain != 0) {
return {1, 0, 0, 0};
}
else {
return {0, 0, 0, 0};
}
}
if (!flag && f[pos][sum][remain].cnt != -1) {
return f[pos][sum][remain];
}
Res ans = {0, 0, 0, 0};
int nex = flag ? num[pos] : 9;
for (int i = 0; i <= nex; i++) {
if (i == 6) {
continue;
}
Res cur = dfs(pos - 1, (sum + i) % 6, (remain * 10 + i) % 6, i == nex && flag);
int s = 1ll * i * p[pos] % mod;
ans.cnt = add(ans.cnt, cur.cnt);
ans.sum1 = add(ans.sum1, add(1ll * s * cur.cnt % mod, cur.sum1));
ans.sum2 = add(add(ans.sum2, 1ll * cur.cnt * s % mod * s % mod), add(cur.sum2, 2ll * s % mod * cur.sum1 % mod));
ans.sum3 = add(ans.sum3, add(add(1ll * cur.cnt * s % mod * s % mod * s % mod, 3ll * s % mod * s % mod * cur.sum1 % mod), add(3ll * s % mod * cur.sum2 % mod, cur.sum3)));
}
if (!flag) {
f[pos][sum][remain] = ans;
}
return ans;
}
int calc(long long x) {
cnt = 0;
while (x) {
num[++cnt] = x % 10;
x /= 10;
}
return dfs(cnt, 0, 0, 1).sum3;
}
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
p[1] = 1;
for (int i = 2; i < 20; i++) {
p[i] = 1ll * p[i - 1] * 10 % mod;
}
long long l, r;
while (scanf("%lld %lld", &l, &r) != EOF) {
printf("%lld\n", sub(calc(r), calc(l - 1)));
}
return 0;
}