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

 

 

 

你可能感兴趣的:(HDU)