求$[1,n]$中有多少个整数是$13$的倍数且十进制下的表示中存在$13$这个子串
$1 \le n \le 10^9$
依旧是数位$dp$,不光要记录一下是否有$13$,还要记录一下模$13$的值
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 20; 5 ll n, dig[N], f[N][4][N]; 6 7 int nxt(int st, int i) { 8 if(st == 0) return i == 1; 9 if(st == 1) return i == 3 ? 2 : i == 1; 10 return st; 11 } 12 13 ll dfs(int pos, int st, int md, int bd) { 14 if(pos == 0) { 15 return st == 2 && md == 0; 16 } else if(!bd && f[pos][st][md] != -1) { 17 return f[pos][st][md]; 18 } else { 19 int top = bd ? dig[pos] : 9; 20 ll sum = 0; 21 for(int i = 0 ; i <= top ; ++ i) 22 sum += dfs(pos - 1, nxt(st, i), (md * 10 + i) % 13, bd && i == top); 23 if(!bd) f[pos][st][md] = sum; 24 return sum; 25 } 26 } 27 28 void sol() { 29 memset(f, -1, sizeof f); 30 int pos = 0; while(n) dig[++ pos] = n % 10, n /= 10; 31 cout << dfs(pos, 0, 0, 1) << endl; 32 } 33 34 int main() { 35 while(cin >> n) sol(); 36 }