HDU 4507 吉哥系列故事——恨7不成妻[数位dp]

来源:互联网 发布:the piano guys知乎 编辑:程序博客网 时间:2024/06/05 14:30

首先计算和7有关的数的个数很简单
然后是算这些数的平方和

struct P{LL cnt,sum,tot;}dp[20][10][10];/*dp[pos][sum][mod]表示枚举到第pos位时,(pos之前的数位和%7)=sum,(pos之前的数%7)=mod如pos=4时,已经枚举了前3位:345sum=(3+4+5)%7=5,mod=(345)%7=2然后可以满足当前这个状态的个数为cnt这些数的和为sum平方和为tot*/

当前枚举位为i,pow[pos]=10^(pos-1),则:

cnt+=next.cnt;//个数直接加sum+=next.sum+i*pow[pos]*next.cnt;//pos位为i对sum的贡献为i*pow[pos]*next.cnt(应该很显然吧)tot+=next.tot+((2*pow[pos]*i)*next.sum)+next.cnt*pow[pos]*pow[pos]*i*i;//假设已经得到了整个数num,令a+b=num,其中 a=已经确定的数,b=num-a//num^2=(a+b)^2=a^2+2*a*b+b^2//就可以把num对tot的贡献分开统计,a直接算,b继续dfs

数比较大要开long long,有很多mod

#include<cstdio>#include<cstring>#define LL long long#define MOD 1000000007using namespace std;inline LL read(){    LL a=0,f=1;char c=getchar();    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}    while(c>='0'&&c<='9'){a=a*10ll+c-'0';c=getchar();}    return a*f;}struct P{LL cnt,sum,tot;}dp[20][10][10];int n;int a[20];LL pow[20];void init(){    memset(dp,-1,sizeof(dp));    pow[1]=1;    for(int i=2;i<=20;++i)        pow[i]=pow[i-1]*10ll%MOD;}P dfs(int pos,int sum,int mod,int pre){    if(pos==0)    {        P tmp={sum&&mod,0,0};        return tmp;    }    if(!pre&&dp[pos][sum][mod].cnt!=-1) return dp[pos][sum][mod];    P tmp={0},ans={0};    int up=pre?a[pos]:9;    for(int i=0;i<=up;++i)        if(i!=7)        {            tmp=dfs(pos-1,(sum+i)%7,(mod*10+i)%7,i==up&&pre);            ans.cnt=(ans.cnt+tmp.cnt)%MOD;            ans.sum=((ans.sum+tmp.sum)%MOD+i*pow[pos]%MOD*tmp.cnt%MOD)%MOD;            ans.tot=(ans.tot+(tmp.tot+((2*pow[pos]*i)%MOD*tmp.sum)%MOD)%MOD)%MOD;            ans.tot=(ans.tot+(tmp.cnt*pow[pos])%MOD*pow[pos]%MOD*i*i%MOD)%MOD;        }    if(!pre) dp[pos][sum][mod]=ans;    return ans;}LL solve(LL x){    LL n=x;int pos=0;    while(n) a[++pos]=n%10,n/=10;    P ans=dfs(pos,0,0,1);    return ans.tot;}int main(){    init();    int i;LL test=read();    while(test--)    {        LL l=read(),r=read();        LL ans=solve(r)-solve(l-1);        ans=(ans+MOD)%MOD;        printf("%lld\n",ans);    }}
阅读全文
0 0
原创粉丝点击