HDU3652 B-number
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3652
#include<bits/stdc++.h> using namespace std; int dp[25][10][2][200];//dp[pos][last digit][13 is exist][num%13] vector<int>shu; int dfs(int pos,int last,int exist13,int num,int sp){ if(pos==-1) return exist13&&num%13==0; if(!sp&&dp[pos][last][exist13][num]!=-1) return dp[pos][last][exist13][num]; int ans=0; int maxn=sp?shu[pos]:9; for(int i=0;i<=maxn;i++){ ans+=dfs(pos-1,i,exist13||(last==1&&i==3),(num*10+i)%13,sp&&i==maxn); } if(!sp) dp[pos][last][exist13][num]=ans; return ans; } int cal(int num){ shu.clear(); while(num){ shu.push_back(num%10); num/=10; } return dfs(shu.size()-1,0,0,0,1); } int main(){ memset(dp,-1,sizeof(dp)); int n; while(~scanf("%d",&n)){ printf("%d\n",cal(n)); } }