//3555
//题意:统计 1 到 n 中包含 49 的数的个数
1 #include "bitsstdc++.h" 2 using namespace std; 3 __int64 dp[22][3]; 4 5 int main() 6 { 7 int i; 8 dp[0][0] = 1; 9 for(i = 1; i <= 20; ++i) { 10 dp[i][0] = dp[i - 1][0] * 10 - dp[i - 1][1] * 1; 11 dp[i][1] = dp[i - 1][0] * 1; 12 dp[i][2] = dp[i - 1][1] * 1 + dp[i - 1][2] * 10; 13 } 14 int T; 15 scanf("%d", &T); 16 while(T--) { 17 __int64 n; 18 scanf("%I64d", &n); 19 int len = 0; 20 int digit[22]; 21 memset(digit, 0, sizeof(digit)); 22 ++n; 23 while(n) { 24 ++len; 25 digit[len] = n % 10; 26 n /= 10; 27 } 28 __int64 res = 0; 29 bool _49 = 0; 30 for(i = len; i >= 1; --i) { 31 //如果已经出现 49 ,则加上第 i 位 -1 后所有数的个数 32 if(_49) { 33 res += (dp[i - 1][0] + dp[i - 1][2]) * digit[i]; 34 } 35 //如果未出现 49, 则加上第 i 位 -1 后所有符合要求的数的个数 36 else { 37 res += dp[i - 1][2] * digit[i]; 38 if(digit[i] > 4) 39 res += dp[i - 1][1] * 1; 40 if(digit[i + 1] == 4 && digit[i] == 9) 41 _49 = 1; 42 } 43 //下一次循环处理,第 i 位 == 原数的情况 44 } 45 printf("%I64d ", res); 46 } 47 }