HDU 4389 X mod f(x) (数位DP)

2015-07-20 17:07:05 · 作者: · 浏览: 5

?
第一次遇到需要先枚举然后再数位DP的。
先枚举各位数之和,即,1~81,然后数位DP过程中再判断枚举的各位数之和与枚举的数是否相同,只有相同的才算。

dp[i][j][k][h]表示第i位上,当前的各位数和为j,枚举的各位数和为k,当前的数对k取模为h的数的个数。
代码如下:

#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include
          #include 
          
            #include 
           
             using namespace std; #define LL __int64 #define pi acos(-1.0) const int mod=1e9+7; const int INF=0x3f3f3f3f; const double eqs=1e-9; const int MAXN=200000+10; int dp[11][82][82][82], dig[11]; int dfs(int cnt, int sum, int mods, int res, int maxd) { if(cnt==-1) return sum==mods&&res==0; if(sum>mods) return 0; if(maxd&&dp[cnt][sum][mods][res]!=-1) return dp[cnt][sum][mods][res]; int i, r=maxd?9:dig[cnt], ans=0; for(i=0;i<=r;i++){ ans+=dfs(cnt-1,sum+i,mods,(res*10+i)%mods,maxd||i