灵活!
首先,需要从后向前dfs,因为后缀。
然后,不用再加limit了,但是在特殊的位置要知道该位加的是0还是1。
这样的话,记住后缀mod k的值,就很好dfs了。
dfs(pod,preMOD,flag)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 #include<string.h> 3 int dp[1005][105][2],shi[1005]; 4 int k,MOD,n; 5 int dfs(int pos,int preMOD,int flag) 6 { 7 int tmp,i,ans=0; 8 if (pos>n) return flag; 9 if (dp[pos][preMOD][flag]!=-1) 10 return dp[pos][preMOD][flag]; 11 tmp=(pos==n?1:0); 12 for (i=tmp;i<=9;i++) 13 ans=(ans+dfs(pos+1,(preMOD+i*shi[pos-1])%k, 14 flag||((preMOD+i*shi[pos-1])%k==0&&i!=0)))%MOD; 15 return dp[pos][preMOD][flag]=ans; 16 } 17 int main() 18 { 19 int cnt,i; 20 scanf("%d%d%d",&n,&k,&MOD); 21 shi[0]=1; 22 for (i=1;i<=1000;i++) shi[i]=shi[i-1]*10%k; 23 memset(dp,-1,sizeof(dp)); 24 printf("%d\n",dfs(1,0,0)); 25 }