1 条题解
-
1赵青海 (huhe) LV 7 SU @ 2023-7-14 10:50:08
# include <bits/stdc++.h> const long long mod = 1e9+7 ; long long powx [30],dig [30],x,y ; int T ; struct Node { long long cnt,sum,sqs ; }dp [25][20][20]; Node dfs (int dep,int res,int num,int lim ) { if (dep == 0 ) { Node tmp = (Node ) { 0,0,0 } ; if (num != 0 && res != 0 ) tmp.cnt = 1 ; return tmp ; } if (! lim && dp [dep][res][num].cnt != - 1 ) return dp [dep][res][num] ; long long i = lim ? dig [dep] : 9 ; Node ans ; ans.cnt = ans.sum = ans.sqs = 0 ; for (; i >= 0 ; i -- ) { if (i != 7 ) { Node tmp = dfs(dep - 1,(res*10+i )%7,(num+i )%7,lim && i == dig [dep] ) ; ans.cnt = (ans.cnt+tmp.cnt )%mod ; ans.sum = ((ans.sum+( (i*powx[dep - 1]%mod)*tmp.cnt )%mod )%mod+tmp.sum )%mod ; ans.sqs = ( (ans.sqs+tmp.sqs+(2*i*powx[dep - 1]%mod*tmp.sum )%mod )%mod+ (i*powx [dep - 1]%mod*powx [dep - 1]%mod*i%mod*tmp.cnt%mod ) %mod)%mod ; } } if (! lim ) dp [dep][res][num] = ans ; return ans ; } long long solve (long long x ) { memset (dp,- 1,sizeof (dp ) ) ; int cnt = 0 ; while (x ) { dig [++ cnt] = x%10 ; x /= 10 ; } return dfs (cnt,0,0,1 ).sqs ; } void init () { powx [0] = 1 ; for (int i = 1 ; i <= 19 ; i ++ ) powx [i] = (1ll*powx [i - 1]*10 )%mod ; } int main () { init () ; scanf ("%d",& T ) ; for (int i = 1 ; i <= T ; i ++ ) { std :: cin >> x >> y ; std :: cout << ((solve (y ) - solve (x - 1 ) )%mod+mod )%mod << std :: endl; } return 0 ; }
- 1
信息
- ID
- 484
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 96
- 已通过
- 20
- 上传者