Problem Description
据说,QAQ 的幸运数字是含有 "47" (4 和 7 相邻)的数,例如 47, 147, 247, 470, 471, 2047 是他的幸运数字,而 74, 1234, 407 就不是他的幸运数字。
而对 C~K 来说,只要不是 QAQ 的幸运数字的数都是他的幸运数字。那么他想问你,在闭区间 [l, r] 中,有多少个自己的幸运数字?
Input
输入数据有多组。第 1 行输入 1 个整数 T (1 <= T <= 10000) 表示数据组数。
对于每组数据,输入 1 行,包含 2 个整数 l, r (1 <= l <= r < 10^9),表示 C~K 要询问的区间。
Output
对于每组数据,在 1 行中输出 1 个整数,表示区间内 C~K 的幸运数字的个数。
Example Input
3 1 1 10 50 1 500
Example Output
1 40 485
// 裸数位dp的一道题, 感觉数位dp不是我等小辈所能讲的懂的, 不如直接奉上代码#include <cstdio> #include <cstring> #include <algorithm> #include <istream> using namespace std; #define N 20 int bit[20]; int dp[20][2]; int dfs(int pos, bool is4, bool islimited) { if(pos == -1) return 1; if(!islimited && dp[pos][is4]) return dp[pos][is4]; int end = islimited ? bit[pos] : 9; int ans = 0; for(int i = 0; i <= end; i++) { if(is4 && i == 7) continue; ans += dfs(pos- 1, i == 4, islimited && i == end); } if(!islimited) { dp[pos][is4] = ans; } return ans; } int solve(int n) { int l = 0; while(n) { bit[l++] = n % 10; n /= 10; } return dfs(l - 1, false, true); } int main() { int left; int right; int t; scanf("%d", &t); while(t--) { scanf("%d %d", &left, &right); printf("%d\n", solve(right) - solve(left - 1)); } return 0; }