写完忘了账号,试了N久。记搜的时候mod了N次,还是不对。发现自己SB的把solve里面传的值写成int了。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
const int mod=1e9+7;
struct Node{
long long cnt,sum,sqsum;
};
long long wei,a[21],T,ans;long long l,r,poww[25];
Node f[21][8][8];
Node dfs(int pos,int m7,int wm7,bool lim) {
if(pos==-1) {
return (Node){m7&&wm7,0,0};
}
if(~ f[pos][m7][wm7].cnt&&lim==false) return f[pos][m7][wm7];
int mx=lim?a[pos]:9;
Node dp;
dp.cnt=dp.sqsum=dp.sum=0;
for(int i=0;i<=mx;i++) {
if(i==7) continue;
Node tmp=dfs(pos-1,(m7*10+i)%7,(wm7+i)%7,lim&&(i==mx));
dp.cnt=(dp.cnt+tmp.cnt)%mod;
dp.sum=(dp.sum+tmp.sum%mod+(poww[pos]*i)%mod*tmp.cnt%mod)%mod;
dp.sqsum=(dp.sqsum+(2*poww[pos]*i)%mod*tmp.sum%mod+(tmp.cnt*poww[pos])%mod*poww[pos]%mod*i%mod*i%mod+tmp.sqsum)%mod;
}
if(!lim) f[pos][m7][wm7]=dp;
return dp;
}
long long solve(long long x) {
memset(f,-1,sizeof f);wei=0;
while(x) a[wei++]=x%10,x/=10;
return dfs(wei-1,0,0,1).sqsum;
}
int main() {
freopen("in.txt","r",stdin);//freopen("out1.txt","w",stdout);
poww[0]=1;
for(int i=1;i<=20;i++) poww[i]=(poww[i-1]*10)%mod;
for(int i=0;i<20;i++)
for(int j=0;j<8;j++)
for(int k=0;k<8;k++)
f[i][j][k].cnt=-1;
cin>>T;
while(T--){
cin>>l>>r;
ans=solve(r)-solve(l-1);ans=(ans%mod+mod)%mod;
printf("%d
",ans);
}
}