Riz1Ahmed

Segmented Sieve (UVA 10140 Prime Distance)

Oct 19th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.24 KB | None | 0 0
  1. /***(Segmented Sieve)**(Prime<=1e18,range[l:r]<=1e6)**(UVA 10140 Prime Distance)***
  2. Given l,r (1<=l,r<=1e18, r-l<=1e6). You have to print 2 min & 2 max distance prime number.
  3. Input: 1 17.   Output: 2,3 are closest, 7,11 are most distant. ***/
  4. #include<cstdio>
  5. #include <vector>
  6. using ll=long long int;
  7. using namespace std;
  8. const ll sz=1e6;
  9. ll fl[sz+5];
  10. vector<ll> primes,NewP;
  11.  
  12. void sieve(){
  13.     for (ll i=3; i*i<=sz; i+=2)
  14.         if (!fl[i])
  15.             for (ll j=i+i; j<=sz; j+=i)
  16.                 fl[j]=1;
  17.     primes.push_back(2);
  18.     for (ll i=3; i<=sz; i+=2)
  19.         if (!fl[i]) primes.push_back(i);
  20. }
  21. /*All prime in [l:r]. 1<=l,r<=1e18. r-l<=1e6.*/
  22. void SegSieve(ll l,ll r){
  23.     memset(fl,0,sizeof fl);
  24.     for (ll i=0; primes[i]*primes[i]<=r; i++){
  25.         ll st=l/primes[i];
  26.         if (st*primes[i]<l) st++;
  27.         if (st==1) st++;
  28.         for (ll j=st*primes[i]; j<=r; j+=primes[i])
  29.             fl[j-l]=1;
  30.     }
  31.     for (ll i=l; i<=r; i++)
  32.         if (!fl[i-l]) NewP.push_back(i);
  33. }
  34. int main(){
  35.     sieve();
  36.     ll l,r;
  37.     while(~scanf("%lld %lld",&l,&r)){
  38.         if (l<2) l=2;
  39.         NewP.clear(), SegSieve(l,r);
  40.         if(NewP.size()<2){
  41.             puts("There are no adjacent primes.");
  42.             continue;
  43.         }
  44.         ll mnl=NewP[0],mnr=NewP[1];
  45.         ll mxl=NewP[0],mxr=NewP[1];
  46.         for (ll i=1; i<NewP.size(); i++){
  47.             if (mnr-mnl>NewP[i]-NewP[i-1])
  48.                 mnl=NewP[i-1],mnr=NewP[i];
  49.             if (mxr-mxl<NewP[i]-NewP[i-1])
  50.                 mxl=NewP[i-1],mxr=NewP[i];
  51.         }
  52.         printf("%lld,%lld are closest, %lld,%lld are most distant.\n",mnl,mnr,mxl,mxr);
  53.     }
  54. }
Add Comment
Please, Sign In to add comment