Matrix_code

math - Count Prime Less than n

Mar 23rd, 2020 (edited)
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define MAXN 100
  4. #define MAXM 100010
  5. #define MAXP 666666
  6. #define MAX 10000010
  7. #define chkbit(ar, i) (((ar[(i) >> 6]) & (1 << (((i) >> 1) & 31))))
  8. #define setbit(ar, i) (((ar[(i) >> 6]) |= (1 << (((i) >> 1) & 31))))
  9. #define isprime(x) (((x) && ((x)&1) && (!chkbit(ar, (x)))) || ((x) == 2))
  10.  
  11. using namespace std;
  12.  
  13. namespace pcf {
  14. long long dp[MAXN][MAXM];
  15. unsigned int ar[(MAX >> 6) + 5] = {0};
  16. int len = 0, primes[MAXP], counter[MAX];
  17.  
  18. void Sieve() {
  19.   setbit(ar, 0), setbit(ar, 1);
  20.   for (int i = 3; (i * i) < MAX; i++, i++) {
  21.     if (!chkbit(ar, i)) {
  22.       int k = i << 1;
  23.       for (int j = (i * i); j < MAX; j += k)
  24.         setbit(ar, j);
  25.     }
  26.   }
  27.  
  28.   for (int i = 1; i < MAX; i++) {
  29.     counter[i] = counter[i - 1];
  30.     if (isprime(i))
  31.       primes[len++] = i, counter[i]++;
  32.   }
  33. }
  34.  
  35. void init() {
  36.   Sieve();
  37.   for (int n = 0; n < MAXN; n++) {
  38.     for (int m = 0; m < MAXM; m++) {
  39.       if (!n)
  40.         dp[n][m] = m;
  41.       else
  42.         dp[n][m] = dp[n - 1][m] - dp[n - 1][m / primes[n - 1]];
  43.     }
  44.   }
  45. }
  46.  
  47. long long phi(int n, long long m) {
  48.   if (n == 0)
  49.     return m;
  50.   if ((long long)primes[n - 1] * primes[n - 1] >= m)
  51.     return counter[m] - n + 1;
  52.   if (m < MAXM && n < MAXN)
  53.     return dp[n][m];
  54.   return phi(n - 1, m) - phi(n - 1, m / primes[n - 1]);
  55. }
  56.  
  57. long long Lehmer(long long m) {
  58.   if (m < MAX)
  59.     return counter[m];
  60.  
  61.   long long w, res = 0;
  62.   int i, a, s, c, x, y;
  63.   s = sqrt(0.9 + m), y = c = cbrt(0.9 + m);
  64.   a = counter[y], res = phi(a, m) + a - 1;
  65.   for (i = a; primes[i] <= s; i++)
  66.     res = res - Lehmer(m / primes[i]) + Lehmer(primes[i]) - 1;
  67.   return res;
  68. }
  69. } // namespace pcf
  70.  
  71. long long solve(long long n) {
  72.   int i, j, k, l;
  73.   long long x, y, res = 0;
  74.  
  75.   for (i = 0; i < pcf::len; i++) {
  76.     x = pcf::primes[i], y = n / x;
  77.     if ((x * x) > n)
  78.       break;
  79.     res += (pcf::Lehmer(y) - pcf::Lehmer(x));
  80.   }
  81.  
  82.   for (i = 0; i < pcf::len; i++) {
  83.     x = pcf::primes[i];
  84.     if ((x * x * x) > n)
  85.       break;
  86.     res++;
  87.   }
  88.  
  89.   return res;
  90. }
  91.  
  92. int main() {
  93.   pcf::init();
  94.   long long n, res;
  95.  
  96.   while (scanf("%lld", &n) != EOF) {
  97.     res = solve(n);
  98.     printf("%lld\n", res);
  99.   }
  100.   return 0;
  101. }
Add Comment
Please, Sign In to add comment