标签:数位dp
题意:中文题。
思路:设dp[pos][i][j]表示当前考虑pos位,之前的数位和对7的余数为i,之前的数值对7的余数为j,与之后的(pos+1)位组合满足条件
的状态(包括之后(pos+1)位满足的个数,后缀和sum,后缀平方和),详见代码:
/********************************************************* file name: hdu4507.cpp author : kereo create time: 2015年02月10日 星期二 22时47分04秒 *********************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<set> #include<map> #include<vector> #include<stack> #include<cmath> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int sigma_size=26; const int N=10; const int MAXN=100; const int inf=0x3fffffff; const double eps=1e-8; const int mod=1000000000+7; #define L(x) (x<<1) #define R(x) (x<<1|1) #define PII pair<int, int> #define mk(x,y) make_pair((x),(y)) ll n,m; int bit[MAXN]; ll base[MAXN]; struct node{ ll num; ll sum,sum2; node(){ num=sum=sum2=0; } }dp[MAXN][N][N]; //dp[pos][i][j]表示当前考虑pos位,之前数位和对7余数为i,之前的数值对7的余数为j,与之后(pos+1)位 //组合满足条件的状态(包括个数num,后缀和sum,后缀平方和) node dfs(int pos,int sum1,int sum2,int flag){ //sum1记录数位和对7的余数,sum2记录值对7的余数 node ans,num; if(pos == -1){ ans.num=sum1 && sum2; return ans; } if(flag && dp[pos][sum1][sum2].num!=-1) return dp[pos][sum1][sum2]; int x=flag ? 9 : bit[pos]; for(int i=0;i<=x;i++){ if(i == 7) continue; num=dfs(pos-1,(sum1+i)%7,(sum2*10+i)%7,flag || i<x); ans.num+=num.num; if(ans.num>=mod) ans.num%=mod; ans.sum+=(base[pos]*i%mod*num.num+num.sum); if(ans.sum>=mod) ans.sum%=mod; ans.sum2+=(base[pos]*base[pos]%mod)*i*i%mod*num.num+2*base[pos]*i%mod*num.sum+num.sum2; if(ans.sum2>=mod) ans.sum2%=mod; } if(flag) dp[pos][sum1][sum2]=ans; return ans; } ll solve(ll x){ int len=0; do{ bit[len++]=x%10; x/=10; }while(x); node ans=dfs(len-1,0,0,0); return ans.sum2; } int main(){ int T; base[0]=1; for(int i=1;i<20;i++) base[i]=(base[i-1]*10)%mod; memset(dp,-1,sizeof(dp)); scanf("%d",&T); while(T--){ scanf("%I64d%I64d",&n,&m); ll ans1=solve(n-1); ll ans2=solve(m); printf("%I64d\n",(ans2-ans1+mod)%mod); } return 0; }
标签:数位dp
原文地址:http://blog.csdn.net/u011645923/article/details/43732313