hdu 4389 X mod f(x) 数位dp

题意:给定函数f(x)为x的数位和,求[A,B]中的x能被f(x)整除的个数。

思路:数位dp。设dp[pos][i][j][k]表示当前考虑pos位,考虑对i的整除,之前的数位和为j,之前对i的余数为k,,与之后(pos+1)位组合

构成满足条件的数的个数。详见代码:

/********************************************************* file name: hdu4389.cpp author : kereo create time: 2015年02月13日 星期五 11时42分19秒*********************************************************/#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=82;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))int A,B;int bit[N],dp[N][MAXN][MAXN][MAXN];//dp[pos][i][j][k]表示当前考虑pos位,考虑对i的整除,之前的数位和为j,之前对i的余数为k,与之后(pos+1)位组合//构成满足条件的数的个数int dfs(int pos,int num,int sum,int cnt,int flag){if(pos == -1)return sum == num && cnt == 0;if(flag && dp[pos][num][sum][cnt]!=-1)return dp[pos][num][sum][cnt];int x=flag ? 9 : bit[pos];int ans=0;for(int i=0;i<=x;i++){ans+=dfs(pos-1,num,sum+i,(cnt*10+i)%num,i<x || flag);}if(flag)dp[pos][num][sum][cnt]=ans;return ans;}int solve(int x){int len=0;do{bit[len++]=x%10;x/=10;}while(x);int ans=0;for(int i=1;i<MAXN;i++){ans+=dfs(len-1,i,0,0,0);}return ans;}int main(){int T,kase=0;scanf("%d",&T);memset(dp,-1,sizeof(dp));while(T–){scanf("%d%d",&A,&B);printf("Case %d: %d\n",++kase,solve(B)-solve(A-1));}return 0;}

总有一天,我会丢下我所有的疲倦和理想,

hdu 4389 X mod f(x) 数位dp

相关文章:

你感兴趣的文章:

标签云: