Advertisement
RaFiN_

segmented sieve

Sep 6th, 2020
1,587
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1.  
  2. // segmented sieve
  3. #include<bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. #define ll long long
  8.  
  9. const int mod = 1e9 + 7;
  10.  
  11. const int N = 1e7 + 10;
  12.  
  13. bitset<N> arr;int prime[1000050],p;
  14.  
  15. void sieve(int n) {
  16.     for(int i = 0; i <= n; i++) arr[i] = 0;
  17.     double z = sqrt(n);
  18.     arr[0] = arr[1] = 1;
  19.     for(int i = 4; i <= n; i += 2) arr[i] = 1;
  20.     for(int i = 3; i <= z; i += 2) {
  21.         if(arr[i] == 0)
  22.         for(ll j = i*i; j <= n; j += i + i) {
  23.             arr[j] = 1;
  24.         }
  25.     }
  26.     prime[p++] = 2;
  27.     for(int i = 3; i <= n; i += 2) if(!arr[i]) prime[p++] = i;
  28. }
  29.  
  30. int main() {
  31.  
  32.     ios_base::sync_with_stdio(0); cin.tie(0);
  33.     #ifndef ONLINE_JUDGE
  34.     freopen("input.txt", "r", stdin);
  35.     freopen("output.txt", "w", stdout);
  36.     #endif
  37.     sieve(1e6);
  38.     int t,ajinka = 1;
  39.     scanf("%d",&t);
  40.     while(t--) {
  41.         ll l,r;
  42.         scanf("%lld%lld",&l,&r);
  43.         vector<int> mark(100005);
  44.         ll mx = 0;
  45.         for(int i = 0; i < p && prime[i] <= r; i++) {
  46.             ll low = l / prime[i] * prime[i];
  47.             if(low < l) low += prime[i];
  48.             if(low == prime[i]) low += prime[i];
  49.             for(ll j = low; j <= r; j += prime[i]) {
  50.                 mark[j - l] = 1;
  51.             }
  52.         }
  53.         int ans = 0;
  54.         for(ll i = l; i <= r; i++) if(!mark[i-l] && i > 1) ans ++;
  55.         printf("Case %d: %d\n",ajinka++,ans);
  56.     }
  57.     return 0;
  58. }
  59.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement