1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
   |  #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std;
  long long dp[25][3];
 
 
 
  void init() {     memset(dp, 0, sizeof(dp));     dp[0][0] = 1;     for(int i = 1; i <= 22; 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];     } }
  long long solve(long long n) {     long long len = 0, a[25], flag = 0, ans = 0;     while(n){         a[++len] = n % 10;         n /= 10;     }     for(int i = len; i >= 1; i--){         ans += dp[i - 1][2] * a[i];         if(flag)             ans += dp[i - 1][0] * a[i];         if(!flag && a[i] > 4)             ans += dp[i - 1][1];         if(a[i + 1] == 4 && a[i] == 9)             flag = 1;     }     return ans; }
  int main() {     int t;     long long n;     init();     scanf("%d", &t);     while(t--){         scanf("%I64d", &n);         printf("%I64d\n", solve(n + 1));     }     return 0; }
 
  |