http://acm.hdu.edu.cn/showproblem.php?pid=3652
13 100 200 1000
1 1 2 2
/*** hdu 3652 数位dp(含13且被能被13整除的数) 题目大意:求出给定区间内的数字含有“13”并且能被13整除的个数 解题思路:记忆化搜索。 dp[i][j][k][z]:i:处理的数位,j:该数对13取模以后的值,k:是否已经包含13,z结尾的数 */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int dp[10][15][2][10],bit[10]; int dfs(int pos,int mod,int t,int now,int flag) { if(pos==-1)return mod==0&&t; if(!flag&&dp[pos][mod][t][now]!=-1)return dp[pos][mod][t][now]; int end=flag?bit[pos]:9; int ans=0; for(int i=0;i<=end;i++) { ans+=dfs(pos-1,(mod*10+i)%13,t||(now==1&&i==3),i,flag&&(i==end)); } if(!flag)dp[pos][mod][t][now]=ans; return ans; } int solve(int n) { int len=0; while(n) { bit[len++]=n%10; n/=10; } return dfs(len-1,0,0,0,1); } int main() { int n; memset(dp,-1,sizeof(dp)); while(~scanf("%d",&n)) { printf("%d\n",solve(n)); } return 0; }