1 #include "cstdio" 2 #include "math.h" 3 #include "cstring" 4 #define mod 1000000007LL 5 #define LL long long 6 7 struct node 8 { 9 LL cnt,sum,sqsum;10 node() {cnt=-1;sum=sqsum=0;}11 node(LL cnt,LL sum,LL sqsum):cnt(cnt),sum(sum),sqsum(sqsum) {}12 }dp[20][10][10];13 14 LL a[20],p[25];15 16 node dfs(int pos,int re1,int re2,bool limit)17 {18 if(!pos) return re1!=0&&re2!=0?node(1,0,0):node(0,0,0);19 if(!limit&&dp[pos][re1][re2].cnt!=-1) return dp[pos][re1][re2];20 int up=limit?a[pos]:9;21 node ans;ans.cnt = 0;22 for(int i=0;i<=up;i++)23 {24 if(i==7) continue;25 node next=dfs(pos-1,(re1+i)%7,(re2*10+i)%7,limit&&i==up);26 ans.cnt+=next.cnt;27 ans.cnt%=mod;28 ans.sum+=(next.sum+((p[pos]*i)%mod)*next.cnt%mod)%mod;29 ans.sum%=mod;30 ans.sqsum+=(next.sqsum+((2*p[pos]*i)%mod)*next.sum)%mod;31 ans.sqsum%=mod;32 ans.sqsum+=((next.cnt*p[pos])%mod*p[pos]%mod*i*i%mod);33 ans.sqsum%=mod;34 }35 if(!limit) dp[pos][re1][re2]=ans;36 return ans;37 }38 39 LL f(LL x)40 {41 int pos=0;42 while(x)43 {44 a[++pos]=x%10;45 x/=10;46 }47 node tt=dfs(pos,0,0,true);48 return tt.sqsum;49 }50 51 int main()52 {53 int T;54 LL l,r;55 scanf("%d",&T);56 p[1]=1;57 for(int i=2;i<=20;i++) p[i]=(p[i-1]*10)%mod;58 while(T--)59 {60 scanf("%I64d%I64d",&l,&r);61 LL ans=f(r);62 ans-=f(l-1);63 printf("%I64d\n",(ans%mod+mod)%mod);64 }65 }