求1-n内,包含13且能够被13整除的数字的个数。 和 hdu 3555 Bomb相差不大,就是多了一个要整除的条件,那就再添加一个状态来标记是否能被13整除。然后数位dp即可。 不过在转移状态的时候,我搞错了 参考:http://blog.csdn.net/libin56842/article/details/10026063
#include <bits/stdc++.h> using namespace std; int dp[15][15][3]; int digit[11]; int len; void calc(int num) { len = 0; while(num) { digit[len++] = num%10; num /= 10; } } int dfs(int i, int mod, int s, bool e) { if(i == -1) return mod==0&&s==2; if(!e && ~dp[i][mod][s]) return dp[i][mod][s]; int res = 0; int u = e?digit[i]:9; for(int d = 0; d <= u; ++d) { int _mod = (mod*10+d)%13; int _s = s; if(s == 0 && d == 1) _s = 1; if(s == 1 && d != 1) _s = 0; if(s == 1 && d == 3) _s = 2; res += dfs(i-1,_mod,_s,e&&d==u); } return e?res:dp[i][mod][s]=res; } int solve(int num) { calc(num); return dfs(len-1,0,0,true); } int main() { int n; memset(dp,-1,sizeof(dp)); while(scanf("%d",&n) != EOF) printf("%d\n",solve(n)); return 0; }