Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define SeeYouAgain return 0
- using ll=long long int;
- using namespace std;
- const ll sz=1e6;
- ll fl[sz+5];
- vector<ll> primes,NewP;
- void sieve(){
- for (ll i=3; i*i<=sz; i+=2){
- if (!fl[i])
- for (ll j=i+i; j<=sz; j+=i)
- fl[j]=1;
- }
- primes.push_back(2);
- for (ll i=3; i<=sz; i+=2)
- if (!fl[i]) primes.push_back(i);
- }
- void SegSieve(ll l,ll r){
- memset(fl,0,sizeof fl);
- for (ll i=0; primes[i]*primes[i]<=r; i++){
- ll st=l/primes[i];
- if (st*primes[i]<l) st++;
- if (st==1) st++;
- //printf("%lld=%lld\n",primes[i],st);
- for (ll j=st*primes[i]; j<=r; j+=primes[i])
- fl[j-l]=1;
- }
- for (ll i=l; i<=r; i++)
- if (!fl[i-l]) NewP.push_back(i);
- }
- int main(){
- sieve();
- ll l,r;
- while(~scanf("%lld %lld",&l,&r)){
- if (l<2) l=2;
- NewP.clear(), SegSieve(l,r);
- if(NewP.size()<2){
- puts("There are no adjacent primes.");
- continue;
- }
- ll mnl=NewP[0],mnr=NewP[1];
- ll mxl=NewP[0],mxr=NewP[1];
- for (ll i=1; i<NewP.size(); i++){
- if (mnr-mnl>NewP[i]-NewP[i-1])
- mnl=NewP[i-1],mnr=NewP[i];
- if (mxr-mxl<NewP[i]-NewP[i-1])
- mxl=NewP[i-1],mxr=NewP[i];
- }
- printf("%lld,%lld are closest, %lld,%lld are most distant.\n",mnl,mnr,mxl,mxr);
- }
- SeeYouAgain;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement