Advertisement
Guest User

Overkill

a guest
Apr 9th, 2017
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define sz(s) ((int) s.size ())
  4. #define all(s) s.begin (), s.end ()
  5.  
  6. using namespace std;
  7.  
  8. /**
  9.  
  10. 1 => 9
  11. 2 => 9 + 8 + 7 + ... + 1 = 45
  12. 3 =>
  13.  
  14. dp[n][d] = sum (dp[n - 1][nd], d <= nd)
  15.  
  16. **/
  17.  
  18. const int N = 29;
  19. const int D = 19;
  20.  
  21. int dp[N][D];
  22.  
  23. bool tidy (int x) {
  24.     vector<int> d;
  25.     for (; x > 0; x /= 10) {
  26.         d.push_back (x % 10);
  27.     }
  28.     reverse (all (d));
  29.     return is_sorted (all (d));
  30. }
  31. int slowGet (int r) {
  32.     int cnt = 0;
  33.     for (int i = 1; i <= r; i++) {
  34.         cnt += tidy (i);
  35.     }
  36.     return cnt;
  37. }
  38. int main () {
  39.     #define name "B-large"
  40.     freopen (name".in", "r", stdin);
  41.     freopen (name".out", "w", stdout);
  42.     for (int digit = 1; digit <= 9; digit++) {
  43.         dp[1][digit] = 1;
  44.     }
  45.     for (int len = 2; len <= 19; len++) {
  46.         for (int digit = 0; digit <= 9; digit++) {
  47.             for (int nextDigit = digit; nextDigit <= 9; nextDigit++) {
  48.                 dp[len][digit] += dp[len - 1][nextDigit];
  49.             }
  50.         }
  51.     }
  52.     int t; cin >> t;
  53.     for (int tt = 1; tt <= t; tt++) {
  54.         string n; cin >> n;
  55.         int len = sz (n);
  56.         int lastDigit = 0;
  57.         long long cur = 0;
  58.         for (int i = len; i >= 1; i--) {
  59.             int curDigit = n[len - i] - '0';
  60.             if (curDigit < lastDigit) {
  61.                 break;
  62.             }
  63.             for (int digit = lastDigit; digit < curDigit + (i == 1); digit++) {
  64.                 cur += dp[i][digit];
  65.             }
  66.             lastDigit = curDigit;
  67. //            cerr << cur << endl;
  68.         }
  69. //        cerr << "Number of tidy numbers from 1 to n is " << cur << " == " << slowGet (atoi (n.c_str ())) << " " << atoi (n.c_str ()) << endl;
  70.         lastDigit = 0;
  71.         string ans = "";
  72.         for (int i = len; i >= 1; i--) {
  73.             for (int digit = lastDigit; digit <= 9; digit++) {
  74.                 if (cur - dp[i][digit] > 0) {
  75.                     cur -= dp[i][digit];
  76. //                    cerr << i << " " << digit << " == " << dp[i][digit] << endl;
  77.                 } else {
  78.                     if ((ans == "" && digit > 0) || ans != "") {
  79.                         ans += char (digit + '0');
  80.                     }
  81.                     lastDigit = digit;
  82.                     break;
  83.                 }
  84.             }
  85.         }
  86.         cout << "Case #" << tt << ": ";
  87.         cout << ans << endl;
  88.     }
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement