解题思路:
与HDU 3555一致。
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <cmath> #include <queue> #include <stack> #define LL long long using namespace std; int dp[10][3]; void init() { dp[0][0] = 1; dp[0][1] = dp[0][2] = 0; for(int i=1;i<=6;i++) { dp[i][0] = dp[i-1][0] * 9 - dp[i-1][1]; dp[i][1] = dp[i-1][0]; dp[i][2] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2] * 10; } } int bit[10]; int solve(int n) { int tmp = n; int len = 0; memset(bit, 0, sizeof(bit)); while(n) { bit[++len] = n % 10; n /= 10; } int ans = 0; bool flag = false; for(int i=len;i>=1;i--) { ans += dp[i-1][2] * bit[i]; if(flag) ans += dp[i-1][0] * bit[i]; if(!flag && bit[i] > 4) ans += dp[i-1][0]; if(!flag && bit[i+1] == 6 && bit[i] > 2) ans += dp[i][1]; if(!flag && bit[i] > 6) ans += dp[i-1][1]; if(bit[i] == 4 || (bit[i+1] == 6 && bit[i] == 2)) flag = true; } if(flag) ans++; return tmp - ans; } int main() { init(); int n, m; while(scanf("%d%d", &n, &m)!=EOF) { if(n == 0 && m == 0) break; printf("%d\n", solve(m) - solve(n-1)); } return 0; }
时间: 2024-11-06 23:01:53