Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. //#pragma GCC optimize ("Ofast")
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <set>
  7. #include <math.h>
  8. #include <algorithm>
  9. #include <utility>
  10. #include <map>
  11. #include <string>
  12. #include <iomanip>
  13. #include <unordered_map>
  14. #include <stack>
  15. #include <queue>
  16. #include <random>
  17. #include <list>
  18. #include <string.h>
  19. #include <bitset>
  20. #include <stdio.h>
  21. using namespace std;
  22.  
  23. typedef long long int LL;
  24. typedef vector<int> VI;
  25. typedef vector<VI> VVI;
  26. typedef vector<VVI> VVVI;
  27. typedef pair<int, int> II;
  28. typedef vector<II> VII;
  29. typedef vector<VII> VVII;
  30. typedef pair<II, int> III;
  31. typedef vector<III> VIII;
  32. typedef vector<double> VD;
  33. typedef vector<VD> VVD;
  34. typedef pair<double, double> DD;
  35. typedef vector<DD> VDD;
  36. typedef vector<LL> VLL;
  37. typedef vector<VLL> VVLL;
  38.  
  39. #define FOR(a, b, c) for (int (a) = (b); (a) < (c); (a)++)
  40. #define REP(a, b) FOR((a), 0, (b))
  41. #define FORD(a, b, c) for (int (a) = (b); (a) >= (c); (a)--)
  42. #define REPD(a, b) FORD((a), (b), 0)
  43. #define PB push_back
  44. #define ITER(it, c) for (auto (it) = (c).begin(); (it) != (c).end(); (it)++)
  45. #define ALL(c) (c).begin(), (c).end()
  46. #define MP make_pair
  47. #define MT(a, b, c) MP(MP((a), (b)), (c))
  48. #define X first
  49. #define Y second
  50. #define FST X.X
  51. #define SND X.Y
  52. #define TRD Y
  53. #define LINF 1e18
  54. #define INF 1e9
  55. #define EPS 1e-9
  56.  
  57. void naive (int n){
  58.     int k = 0;
  59.     REP(i, n){
  60.         k ++;
  61.         if (to_string(k).find("13") != -1){
  62.             //cout << i << ": " << k << endl;
  63.             i --;
  64.         }
  65.     }
  66.     cout << k << endl;
  67. }
  68.  
  69. int count13(int n){
  70.     int ans = 0;
  71.     REP(i, n+1){
  72.         if (to_string(i).find("13") != -1)
  73.             ans ++;
  74.     }
  75.     return ans;
  76. }
  77.  
  78. int log10(int n){
  79.     int ret = -1;
  80.     LL p = 1;
  81.     while(p <= n)
  82.         ret ++, p *= 10;
  83.     return ret;
  84. }
  85.  
  86. int pow10(int n){
  87.     int ret = 1;
  88.     REP(i, n)
  89.         ret *= 10;
  90.     return ret;
  91. }
  92.  
  93. map<II, int> dp;
  94.  
  95. int f (int m, int n){ //13's between m and n
  96.     auto it = dp.find(MP(m, n));
  97.     if (it != dp.end())
  98.         return it->Y;
  99.  
  100.     int p = log10(n);
  101.     if (pow10(p) == n)
  102.         p --;
  103.     if (p <= 0)
  104.         return 0;
  105.     int ret = 0;
  106.     int i = m; // i = num pos
  107.     while(true){
  108.  
  109.         if (i == pow10(p)){ //catch the 3
  110.  
  111.             int d[3] = {3, 1, 6};
  112.             bool done = false;
  113.             int P = pow10(p)/10, start = i;
  114.  
  115.             REP(k, 3){
  116.                 int add = d[k]*P;
  117.                 int from = i, to = min(i+add, n);
  118.  
  119.                 if (k == 1)
  120.                     ret += to-from;
  121.                 else ret += f(from-start, to-start);
  122.  
  123.                 if (i+add > n){
  124.                     done = true;
  125.                     break;
  126.                 }
  127.                 i += add;
  128.             }
  129.             if (done)
  130.                 break;
  131.  
  132.         } else {
  133.             int add = pow10(p);
  134.             int from = i, to = min(i+add, n);
  135.             ret += f(0, to-from);
  136.             if (i+add > n){
  137.                 break;
  138.             }
  139.             i += add;
  140.         }
  141.     }
  142.  
  143.     return dp[MP(m, n)] = ret;
  144. }
  145.  
  146. int main()
  147. {
  148.     ios_base::sync_with_stdio(false);
  149.     int n = 14545352;
  150.    
  151.     //cout << log10(0) << endl;
  152.     //cout << "f(" << n << ") = " << f(0, n) << endl;
  153.     //cout << ", real is " << count13(n) << endl;
  154.  
  155.     cin >> n;
  156.  
  157.     LL bot = 1, top = 2e9;
  158.  
  159.     while(bot != top){
  160.         int mid = (bot+top+1)/2;
  161.         //cout << bot << ", " << top << endl;
  162.         int ans = mid-f(0, mid); // we want upper bound
  163.         if (ans <= n)
  164.             bot = mid;
  165.         else top = mid-1;
  166.     }
  167.     cout << bot << endl;
  168.     //naive(n);
  169.  
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement