hdu 4722 good number 数位dp入门

来源:互联网 发布:js获取日期时间 编辑:程序博客网 时间:2024/05/16 02:02
明显dp[i][j][k] 表示i为取j的时候余数为k的个数 然后dp方程就显然可得了,我看其他人都是2位,少了j这个位,但是我认为有这位比较清楚啊,贴上代码
#include<cstdio>#include<cstring>#define M 25#define ll __int64ll dp[M][10][10];void init(){    memset(dp,0,sizeof(dp));    dp[0][0][0]=1;    ll n=10;    for(ll i=0;i<M-1;i++){        for(ll j=0;j<n;j++){            for(ll k=0;k<n;k++){                for(ll k1=0;k1<n;k1++){                    ll t1=(k+k1)%n;                    dp[i+1][k1][t1]+=dp[i][j][k];                }            }        }    }}ll w[M];ll f(ll n){    if(n==0) return 0ll;    ll len=0;    while(n){        w[++len]=n%10;        n/=10;    }    ll flag=0;    ll tsum=0;    for(ll i=len;i>=1;i--){        for(ll j=0;j<w[i];j++){            ll t1=(100-flag)%10;            tsum+=dp[i][j][t1];        }        flag+=w[i];        flag%=10;    }    return tsum;}int main(){    init();    ll cas;    while(~scanf("%I64d",&cas)){        for(ll q=1;q<=cas;q++){            ll a,b;scanf("%I64d%I64d",&a,&b);            printf("Case #%I64d: ",q);            printf("%I64d\n",f(b+1)-f(a));        }    }    return 0;}/*33213 65465456*/