hdu 4389 X mod f(x) 数位DP

思路:

每次枚举数字和也就是取模的f(x),这样方便计算。

其他就是基本的数位Dp了。

代码如下:

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<vector>
 8 #define ll __int64
 9 #define pi acos(-1.0)
10 #define MAX 50000
11 using namespace std;
12 int bit[10],dp[10][90][90][90];
13 int dfs(int pos,int num,int mod,int sum,bool f)
14 {
15     if(pos==-1) return mod==sum&&num==0;
16     if(!f&&dp[pos][mod][num][sum]!=-1) return dp[pos][mod][num][sum];
17     int ans=0;
18     int e=f?bit[pos]:9;
19     for(int i=0;i<=e;i++){
20         ans+=dfs(pos-1,(10*num+i)%mod,mod,sum+i,f&&i==bit[pos]);
21     }
22     if(!f) dp[pos][mod][num][sum]=ans;
23     return ans;
24 }
25 int cal(int n)
26 {
27     int m=0;
28     while(n){
29         bit[m++]=n%10;
30         n/=10;
31     }
32     int ans=0;
33     for(int i=1;i<=9*m;i++)
34         ans+=dfs(m-1,0,i,0,1);
35     return ans;
36 }
37 int main(){
38     int t,n,m,ca=0;
39     memset(dp,-1,sizeof(dp));
40     scanf("%d",&t);
41     while(t--){
42         scanf("%d%d",&n,&m);
43         printf("Case %d: %d\n",++ca,cal(m)-cal(n-1));
44     }
45     return 0;
46 }
View Code

 

 

 

posted @ 2013-09-09 08:55  _随心所欲_  阅读(232)  评论(0编辑  收藏  举报