和 HDOJ 3555 一样啊,只不过需要多判断个 ‘4’
我有写 3555 直接去看那篇吧
这里只放代码
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int n, m, num[15], dp[15][2]; inline int dfs(int l, bool flag, bool limit) { if(l == 0) return 1; if(!limit && dp[l][flag]) return dp[l][flag]; int ans = 0, mx = (limit ? num[l] : 9); for(int i=0; i<=mx; i++) { if(i == 4) continue; if(flag && i == 2) continue; ans += dfs(l-1, i == 6, limit && i == mx); } return limit ? ans : dp[l][flag] = ans; } inline int solve(int x) { memset(num, 0, sizeof(num)); int k = 0; while (x != 0) { num[++k] = x % 10; x /= 10; } return dfs(k, false, true); } int main() { while (scanf("%d%d", &n, &m) == 2) { if(n == 0 && m == 0) break; printf("%d ", solve(m)-solve(n-1)); } return 0; }