标签:
题意:
寻找0 到 n 中含有49的数字的个数
#include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <queue> #include <stack> #include <queue> using namespace std; const int MAXN = 50 + 10; long long dp[MAXN][3]; // dp[i][0] 长度为i,不含49 // dp[i][1] 长度为i,不含49但首位为9 // dp[i][2] 长度为i,含有49 void init() { dp[0][0] = 1; dp[0][1] = dp[0][2] = 0; for(int i=1;i<=MAXN;i++) { dp[i][0] = dp[i-1][0] * 10 - dp[i-1][1]; dp[i][1] = dp[i-1][0]; dp[i][2] = dp[i-1][2] * 10 + dp[i-1][1]; } } int bit[MAXN]; long long solve(long long n) { int len = 0; memset(bit, 0, sizeof(bit)); while(n) { bit[++len] = n % 10; n /= 10; } long long ans = 0; int flag = 0; for(int i=len;i>=1;i--) { ans += dp[i-1][2] * bit[i]; if(flag) ans += dp[i-1][0] * bit[i]; else { if(bit[i] > 4) ans += dp[i-1][1]; } if(bit[i+1] == 4 && bit[i] == 9) flag = 1; } if(flag) ans++; return ans; } int main() { long long n; int T; init(); scanf("%d", &T); while(T--) { scanf("%I64d", &n); printf("%I64d\n", solve(n)); } return 0; }
标签:
原文地址:http://blog.csdn.net/moguxiaozhe/article/details/45314961