13 100 200 1000
1 1 2 2
dfs的时候需要继续前一位是不是1,有没有出现13,这一位是不是9.
#include <bits/stdc++.h> using namespace std; long long n; int bit[22], cnt; long long dp[22][22][2][2]; long long dfs (int pos, int m1, bool f1, bool f2, bool f3) { //位 余数 前一位是不是1 能不能取到9 有没有出现13 if (pos == 0) { return (m1 == 0 && f3); } if (f2 && dp[pos][m1][f1][f3] != -1) { return dp[pos][m1][f1][f3]; } int Max = (f2 ? 9 : bit[pos]); long long ans = 0; for (int i = 0; i <= Max; i++) { ans += dfs (pos-1, (m1*10+i)%13, i == 1, f2||(i<Max), f3||(f1&&(i==3))); } if (f2) dp[pos][m1][f1][f3] = ans; return ans; } long long f (long long num) { cnt = 0; while (num) { bit[++cnt] = num%10; num /= 10; } return dfs (cnt, 0, 0, 0, 0); } int main () { memset (dp, -1, sizeof dp); while (cin >> n) { cout << f (n) << endl; } return 0; }