标签:for 告诉 就会 lib 故事 using family 之一 statistic
Time Limit: 1000/500 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
#include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #define lo long long #define mod 1000000007 using namespace std; int a[23]; lo mi[41]; //mi[i]:10的i次幂 inline lo read() { register long long ans=0,f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} while(isdigit(ch)) {ans=ans*10+ch-‘0‘;ch=getchar();} return ans*f; } struct num{ lo su,sq,nu; //和,平方和,个数 num(lo u=0,lo q=0,lo n=0):su(u),sq(q),nu(n){} }dp[23][11][11]; num dfs(int wi,int o,lo e,bool lim) //哪一位,每一位%7,数%7,限制? { num ans,zc; if(wi<1) { ans.nu=o&&e; return ans; } if(!lim&&dp[wi][o][e].su>-1) return dp[wi][o][e]; int l=lim? a[wi]:9; for(lo i=0;i<=l;i++) if(i!=7) ////// { zc=dfs(wi-1,(o+i)%7,(lo)(e*10+i)%7,lim&&i==a[wi]); //e+i*mi[wi-1]? ans.sq=(((ans.sq+i*i*mi[2*wi-2]%mod*zc.nu%mod)%mod+zc.sq)%mod+(lo)2*zc.su*i%mod*mi[wi-1]%mod)%mod; ans.su=((ans.su+zc.su)%mod+zc.nu*i%mod*mi[wi-1]%mod)%mod; ans.nu=(ans.nu+zc.nu)%mod; } if(!lim) dp[wi][o][e]=ans; return ans; } lo sol(lo x) { int w=0; while(x) { a[++w]=x%10; x/=10; } num ans=dfs(w,0,(lo)0,1); return ans.sq; } int main() { int t;lo l,r; t=read(); mi[0]=1; for(int i=1;i<=38;i++) mi[i]=mi[i-1]*10%mod; memset(dp,-1,sizeof(dp)); while(t--) { l=read();r=read(); lo rr=sol(r); lo ll=sol(l-1); printf("%lld\n",(rr+mod-ll)%mod); } return 0; }
标签:for 告诉 就会 lib 故事 using family 之一 statistic
原文地址:http://www.cnblogs.com/charlotte-o/p/7615346.html