Advertisement
albnayem

Contest Problem G

Mar 25th, 2019
100
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. #define MAX 100000
  3. #define ll   long long
  4.  
  5. using namespace std;
  6. vector<long long int> smallprimes;
  7.  
  8. void sieve() {
  9.     bool isPrime[MAX];
  10.     for (ll i = 0; i < MAX; i++) isPrime[i] = true;
  11.     for (ll i = 3; i * i <= MAX; i += 2)
  12.         if (isPrime[i])
  13.             for (ll j = i * i; j < MAX; j += i)
  14.                 isPrime[j] = false;
  15.     smallprimes.push_back(2);
  16.     for (ll i = 3; i < MAX; i += 2)
  17.         if (isPrime[i]) smallprimes.push_back(i);
  18. }
  19.  
  20. void segSieve (ll lower,ll upper) {
  21.     bool isPrime[1000010];
  22.     for (ll i = 0; i <= upper - lower ; i++) isPrime[i] = true;
  23.     if (lower == 1) isPrime[0] = false;
  24.     for (ll i = 0; smallprimes[i]*smallprimes[i] <= upper; i++) {
  25.         ll cur = smallprimes[i];
  26.         ll base = (lower/cur)*cur;
  27.         if (base < lower) base += cur;
  28.         for (ll j = base; j <= upper; j += cur)
  29.             isPrime[j-lower] = false;
  30.         if (base == cur) isPrime[base-lower] = true;
  31.     }
  32.     ll dif,min_dif=1000010,max_dif=0,mnv1,mnv2,mxv1,mxv2,curitem;
  33.     bool check=true;
  34.     //for (ll int i=0;i<upper-lower-1;i++)
  35.     //{2111111207,2111111209 are closest, 2111111213,2111111291 are most distant.
  36.  
  37.       //  if(isPrime[i]) cout<<i+lower<<endl;
  38.     //}
  39.  
  40.  
  41.  
  42.      for (ll i = 0; i < upper - lower + 1; i++) {
  43.         if ( check && isPrime[i]){
  44.             curitem=i+lower;
  45.             //cout<<"First curitem = "<<curitem<<endl;
  46.             check=false;
  47.             continue;
  48.         }
  49.         if (isPrime[i]){
  50.             dif=(i+lower)-curitem;
  51.             //cout<<"Curitem  = "<<curitem<<" Dif = "<<dif<<endl;
  52.             if (dif>max_dif){
  53.                 max_dif=dif;
  54.                 mxv1=curitem;
  55.                 mxv2=i+lower;
  56.             }
  57.             if (dif<min_dif){
  58.                 min_dif=dif;
  59.                 mnv1=curitem;
  60.                 mnv2=i+lower;
  61.             }
  62.             curitem=i+lower;
  63.         }
  64.     }
  65.     if (max_dif==0) cout<<"There are no adjacent primes."<<endl;
  66.     else cout<<mnv1<<","<<mnv2<<" are closest, "<<mxv1<<","<<mxv2<<" are most distant."<<endl;
  67. }
  68.  
  69.  
  70.  
  71. int main() {
  72.  
  73.     sieve();
  74.     ll int l, u;
  75.     while(cin>>l>>u) {
  76.         segSieve(l,u);
  77.     }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement