DFS套路。
cur , x , f , g 分别表示 进行到第cur位,前缀数字是x,f表示是否满数字,g代表是否含前导0
#include<iostream> #include<algorithm> #include<bitset> #include<tuple> #include<unordered_map> #include<fstream> #include<iomanip> #include<string> #include<cmath> #include<cstring> #include<vector> #include<map> #include<set> #include<list> #include<queue> #include<stack> #include<sstream> #include<cstdio> #include<ctime> #include<cstdlib> #define INF 0x3f3f3f3f #define inf 0x7FFFFFFF #define MOD 998244353 #define moD 1000000003 #define pii pair<int,string> #define eps 1e-8 #define equals(a,b) (fabs(a-b)<eps) #define bug puts("bug") #define re register #define fi first #define se second const int maxn = 1e6 + 5; const double Inf = 10000.0; const double PI = acos(-1.0); typedef long long ll; typedef unsigned long long ull; using namespace std; int dp[10][10][2][2]; vector<int> v; int len; void init(int n) { v.clear(); while (n) v.push_back(n % 10), n /= 10; reverse(v.begin(), v.end()); len = v.size(); } int dfs(int cur, int x, bool f, bool g) { if (cur == len) return 1; if (dp[cur][x][f][g] != -1) return dp[cur][x][f][g]; int t = 9; if (f == 1) t = v[cur]; int ans = 0; for (int i = 0; i <= t; i++) { if (i == 4) continue; if (g) { if (!i) ans += dfs(cur + 1, 0, f & (i == t), 1); else ans += dfs(cur + 1, i, f & (i == t), 0); } else if (x == 6 && i == 2) continue; else { ans += dfs(cur + 1, i, f & (i == t), 0); } } return dp[cur][x][f][g] = ans; } int solve(int x) { init(x); memset(dp, -1, sizeof dp); return dfs(0, 0, 1, 1); } int check(int x) { init(x); for (int i = 0; i < v.size() - 1; i++) { if (v[i] == 6 && v[i + 1] == 2) return 0; if (v[i] == 4) return 0; } if (v.back() == 4) return 0; return 1; } int main() { int l, r; while (scanf("%d%d", &l, &r), l || r) { printf("%d ", solve(r) - solve(l) + check(l)); } }