hdu 4507 吉哥系列故事――恨7不成妻 数位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;}

开上一部车,装着我们的故事,

hdu 4507 吉哥系列故事――恨7不成妻 数位dp

相关文章:

你感兴趣的文章:

标签云: