Kaidul

Segmented Sieve

Dec 25th, 2016
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.15 KB | None | 0 0
  1. //  Created by Kaidul Islam on 18/4/16.
  2. //  Copyright © 2016 Kaidul Islam. All rights reserved.
  3. //
  4. //
  5. #include <bits/stdc++.h>
  6.  
  7. using namespace std;
  8.  
  9. #define rep(i, n) for(__typeof(n) i = 0; i < (n); i++)
  10. #define rrep(i, n) for(__typeof(n) i = (n) - 1; i >= 0; --i)
  11. #define rep1(i, n) for(__typeof(n) i = 1; i <= (n); i++)
  12. #define FOR(i, a, b) for(__typeof(b) i = (a); i <= (b); i++)
  13. #define forstl(i, s) for (__typeof ((s).end ()) i = (s).begin (); i != (s).end (); ++i)
  14. #define SZ(v) ((int)v.size())
  15. #define INF (1 << 30)
  16. #define PI acos(-1.0)
  17. #define bitcnt __builtin_popcount
  18. #define pb push_back
  19. #define ppb pop_back
  20. #define all(x) x.begin(), x.end()
  21. #define mem(x, y) memset(x, y, sizeof x)
  22. #define eps 1e-9
  23. #define pii pair<int, int>
  24. #define couple make_pair
  25. #define X first
  26. #define Y second
  27. #define vi vector<int>
  28. #define vpii vector< pii >
  29. #define si set<int>
  30. #define SDi(x) sf("%d", &x)
  31. #define SD2(x, y) sf("%d %d", &x, &y)
  32. #define SD3(x, y, z) sf("%d %d %d", &x, &y, &z)
  33. #define SDs(x) sf("%s", x)
  34. #define pf printf
  35. #define print(x) pf("%d ", x)
  36. #define println(x) pf("%d\n", x)
  37. #define output(x, y); pf("Case %d: %d", ++x, y)
  38. #define newLine pf("\n")
  39. #define sf scanf
  40. #define READ(f) freopen(f, "r", stdin)
  41. #define WRITE(f) freopen(f, "w", stdout)
  42. #if ( _WIN32 or __WIN32__ )
  43. #define LLD "%I64d"
  44. #else
  45. #define LLD "%lld"
  46. #endif
  47. #define SDl(x) sf(LLD, &x)
  48. #define MAX5 100005
  49. #define MAX7 10000007
  50. #define MAX9 1000000009
  51. #define MOD9 1000000007
  52. typedef long long i64;
  53. typedef unsigned long long ui64;
  54. const i64 INF64 = (i64) 1E18;
  55.  
  56. template<typename T> string toStr(T n) { ostringstream oss; oss << n; oss.flush(); return oss.str(); }
  57. template<typename T> T toInt(string s) { T n = 0; istringstream sin(s); sin >> n; return n; }
  58.  
  59. class TimeTracker {
  60.     clock_t start, end;
  61. public:
  62.     TimeTracker() {
  63.         start = clock();
  64.     }
  65.     ~TimeTracker() {
  66.         end = clock();
  67.         fprintf(stderr, "%.3lf s\n", (double)(end - start) / CLOCKS_PER_SEC);
  68.     }
  69. };
  70.  
  71. struct Point {
  72.     int x, y;
  73.     Point(): x(0), y(0) {}
  74.     Point(int a, int b): x(a), y(b) {}
  75.     bool operator < (const Point& other) const {
  76.         return x < other.x;
  77.     }
  78. };
  79. // BitMask
  80. int Set(int N, int pos) {
  81.     return N |= (1 << pos);
  82. }
  83. int Reset(int N, int pos) {
  84.     return N &= ~(1 << pos);
  85. }
  86. int Check(int N, int pos) {
  87.     return (N & (1 << pos));
  88. }
  89. int toggle(int N, int pos) {
  90.     return N ^= (1 << pos);
  91. }
  92.  
  93. // direction array
  94. //int dx[] = {0, -1, 0, 1};
  95. //int dy[] = {-1, 0, 1, 0};
  96. //int Dx[] = {0, -1, -1, -1, 0, 1, 1, 1};
  97. //int Dy[] = {-1, -1, 0, 1, 1, 1, 0, -1};
  98. //int _row, _col;
  99. //inline bool isValid(int i, int j) {
  100. //    return i >= 0 and j >= 0 and i < _row and j < _col;
  101. //}
  102.  
  103. #define MOD (MAX9 + 7)
  104.  
  105. inline void IncMod(int &x, int y) {
  106.     x += y;
  107.     if (x >= MOD) {
  108.         x -= MOD;
  109.     }
  110. }
  111.  
  112. #define keyType int
  113. class Compare {
  114. public:
  115.     bool operator() (keyType& lhs, keyType& rhs) const {
  116.         return lhs > rhs;
  117.     }
  118. } compare;
  119. // e.g. sort(all(arr), compare)
  120.  
  121.  
  122. #define error(args...) { vector<string> _v; split(#args, ',', _v); err(_v.begin(), args); }
  123.  
  124. void split(const string& s, char c, vector<string>& result) {
  125.     stringstream ss(s);
  126.     string x;
  127.     while (getline(ss, x, c))
  128.         result.push_back(x);
  129. }
  130.  
  131. void err(vector<string>::iterator it) {}
  132. template<typename T, typename... Args>
  133. void err(vector<string>::iterator it, T a, Args... args) {
  134.     cerr << it -> substr((*it)[0] == ' ', it -> length()) << " = " << a << '\n';
  135.     err(++it, args...);
  136. }
  137.  
  138. /** Implementation **/
  139.  
  140. #define MAX 46350 // ~sqrt(INT_MAX)
  141.  
  142. vector<int> primes;
  143. vector<bool> marked;
  144.  
  145. void sieve(int n) {
  146.     int sqrtN = sqrt(n);
  147.     marked = vector<bool>(n + 1, false);
  148.     for(int i = 3; i <= sqrtN; i += 2) {
  149.         if(!marked[i]) {
  150.             for(int j = i; j <= n; j += (i << 1)) {
  151.                 marked[j] = true;
  152.             }
  153.             marked[i] = false;
  154.         }
  155.     }
  156.     if(n >= 2) primes.push_back(2);
  157.     for(int i = 3; i <= n; i += 2) {
  158.         if(!marked[i]) {
  159.             primes.push_back(i);
  160.         }
  161.     }
  162. }
  163.  
  164. int arr[MAX5];
  165.  
  166. ///Returns number of primes between segment [a,b]
  167. void segmentedSieve2(unsigned int a, unsigned int b ) {
  168.     if ( a == 1 ) a++;
  169.  
  170.     int sqrtn = sqrt ( b );
  171.  
  172.     memset ( arr, 0, sizeof arr ); ///Make all index of arr 0.
  173.  
  174.     for ( int i = 0; i < primes.size() && primes[i] <= sqrtn; i++ ) {
  175.         int p = primes[i];
  176.         int j = p * p;
  177.  
  178.         ///If j is smaller than a, then shift it inside of segment [a,b]
  179.         if ( j < a ) j = ( ( a + p - 1 ) / p ) * p;
  180.  
  181.         for ( ; j <= b; j += p ) {
  182.             arr[j-a] = 1; ///mark them as not prime
  183.         }
  184.     }
  185.  
  186. //    int res = 0;
  187.     for ( int i = a; i <= b; i++ ) {
  188.         ///If it is not marked, then it is a prime
  189.         if ( arr[i-a] == 0 ) println(i);
  190.     }
  191. //    return res;
  192. }
  193.  
  194. int segmentedSieve(unsigned int left, unsigned int right) {
  195.     /*
  196.     auto lbound = lower_bound(primes.begin(), primes.end(), left);
  197.     for(auto it = lbound; it != primes.end() and *it <= right; ++it) {
  198.         println(*it);
  199.     }
  200.     if(MAX > left and MAX < right) {
  201.         left = MAX + 1;
  202.     }
  203.     */
  204.     int sqrtR = sqrt(right);
  205.     marked = vector<bool>(right - left + 1, false);
  206.  
  207.     for(int i = 1; i < primes.size() and primes[i] <= sqrtR; i++) {
  208.  
  209.         int offset = ((left + primes[i] - 1) / primes[i]) * primes[i];
  210.         for(int j = offset; j <= right; j += (primes[i] << 1)) {
  211.             marked[j - left] = true;
  212.         }
  213.         if(offset == primes[i]) {
  214.             marked[offset - left] = false;
  215.         }
  216.  
  217.     }
  218.  
  219.     int cnt = 0;
  220.     if(left <= 2 and 2 <= right) {
  221.         cnt++;
  222.     }
  223.     for(int i = max(((left & 1) ? left : left + 1), 3U); i <= right; i += 2) {
  224.         cnt += !marked[i - left];
  225.     }
  226.  
  227.     return cnt;
  228. }
  229.  
  230. int main(int argc, const char * argv[]) {
  231. #ifndef ONLINE_JUDGE
  232.     assert(READ("input.txt"));
  233. #endif
  234.     int tcase;
  235.     SDi(tcase);
  236.     sieve(MAX);
  237.     int m, n;
  238.     int caseNo = 0;
  239.     while(tcase--) {
  240.         SD2(m, n);
  241.         segmentedSieve2(m, n);
  242.         if(tcase > 0) newLine;
  243.     }
  244.     return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment