Guest User

Untitled

a guest
Dec 31st, 2020
747
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. #pragma GCC optimize("Ofast")
  4. #define x first
  5. #define y second
  6. #define ld long double
  7. #define ll long long
  8. #define ull unsigned long long
  9. #define us unsigned short
  10. #define lsb(x) ((x) & (-(x)))
  11.  
  12. using namespace std;
  13.  
  14. const int X = 5; // number of "buckets" ?!
  15. const int N = (int)1e7; // precalculated values
  16.  
  17. ll n;
  18.  
  19. bitset <N + 5> viz;
  20. vector <int> prime;
  21. unordered_map <ll, ll> calc_phi, calc_pi, p[5];
  22. int pi[N + 5];
  23. int memo[(1 << 10)];
  24.  
  25. ll get_pi(ll n);
  26. //ll P(int niv, ll n, int a);
  27.  
  28. void sieve() {
  29.   prime.push_back(0);
  30.   for(int i = 4; i <= N; i += 2)
  31.     viz[i] = 1;
  32.   for(int i = 3; i * i <= N; i++) {
  33.     if(!viz[i]) {
  34.       for(int j = i * i; j <= N; j += 2 * i)
  35.         viz[j] = 1;
  36.     }
  37.   }
  38.   for(int i = 2; i <= N; i++) {
  39.     pi[i] = pi[i - 1];
  40.     if(!viz[i])
  41.       prime.push_back(i), pi[i]++;
  42.   }
  43. }
  44.  
  45. void precalc() {
  46.   for(int i = 0; i < (1 << 5); i++) {
  47.       int prod = 1;
  48.       for(int j = 0; j < 5; j++) {
  49.         if((i >> j) & 1)
  50.           prod *= prime[j + 1];
  51.       }
  52.       memo[i] = (__builtin_popcount(i) % 2 == 0 ? 1 : -1) * prod;
  53.   }
  54. }
  55.  
  56. ll cod(ll n, int m) {
  57.   return n * 10000 + m;
  58. }
  59.  
  60. ll f(ll n, int m) {
  61.   if(!n)
  62.     return 0;
  63.   if(m == 0) {
  64.     //calc[cod(n, m)] = ans;
  65.     return n;
  66.   }
  67.   /*if(calc_phi.find(cod(n, m)) != calc_phi.end())
  68.     return calc_phi[cod(n, m)];
  69.   calc_phi[cod(n, m)] = f(n, m - 1) - f(n / prime[m], m - 1);
  70.   return calc_phi[cod(n, m)];*/
  71.   return f(n, m - 1) - f(n / prime[m], m - 1);
  72. }
  73.  
  74. ll P(int niv, ll n, int a) {
  75.   int b = get_pi((ll)(pow(n, 1.0 / niv) + 1e-9));
  76.   ll ans = 0;
  77.   if(niv == 2) {
  78.     for(int i = a + 1; i <= b; i++)
  79.       ans += get_pi(n / prime[i]);
  80.     ans -= 1LL * (b - a) * (b + a - 1) / 2;
  81.   } else {
  82.     for(int i = a + 1; i <= b; i++)
  83.       ans += P(niv - 1, n / prime[i], i - 1);
  84.   }
  85.   return ans;
  86. }
  87.  
  88. void reset() {
  89.   calc_phi.clear();
  90.   calc_pi.clear();
  91.   for(int i = 2; i < X; i++)
  92.     p[i].clear();
  93. }
  94.  
  95. ll get_pi(ll n) { // number of primes <= n
  96.   if(n <= N)
  97.     return pi[n];
  98.   int a = get_pi((int)(pow(n, 1.0 / X) + 1e-9));
  99.   ll ans = f(n, a) + a - 1;
  100.   for(int i = 2; i <= X; i++)
  101.     ans -= P(i, n, a);
  102.   return ans;
  103. }
  104.  
  105. ll get_prime(ll n) { // n-th prime number
  106.   if(n <= 1000)
  107.     return prime[n];
  108.   ll st = n * log(n) + n * log(log(n)) - n, dr = n * log(n) + n * log(log(n)), mid;
  109.   while(st <= dr) {
  110.     mid = (st + dr) >> 1;
  111.     //reset();
  112.     if(get_pi(mid) < n)
  113.       st = mid + 1;
  114.     else
  115.       dr = mid - 1;
  116.   }
  117.   return st;
  118. }
  119.  
  120. int main() {
  121.   cin >> n;
  122.   //ld start = clock();
  123.   sieve();
  124.   //precalc();
  125.   cout << get_pi(n);
  126.   //ld end = clock();
  127.   //cout << (end - start) / CLOCKS_PER_SEC << "s time taken";
  128.   return 0;
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment