#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #define LL long long using namespace std; int dp[15][15][2][10]; int bit[15]; int dfs(int pos,int num,int t,int e,bool flag) { if(pos == 0) return t && (num == 0); if(!flag && dp[pos][num][t][e] != -1) return dp[pos][num][t][e]; int end = flag ? bit[pos] : 9; int ans = 0; for(int i=0;i<=end;i++) { ans += dfs(pos-1,(num * 10 + i) % 13, t||(e==1&&i==3), i,flag &&(i==end)); } if(!flag) dp[pos][num][t][e] = ans; return ans; } int solve(int n) { memset(bit, 0, sizeof(bit)); int len = 0; while(n) { bit[++len] = n % 10; n /= 10; } return dfs(len,0,0,0,1); } int main() { int n; while(scanf("%d", &n)!=EOF) { memset(dp, -1, sizeof(dp)); printf("%d\n", solve(n)); } return 0; }
原文地址:http://blog.csdn.net/moguxiaozhe/article/details/43916469