注意l=0的时候特判一下,而且这方法的取值范围是[l,u)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
#define maxn 1000010
#define maxn_b 50001
typedef long long ll;
int is_prime[maxn]; //b-a的范围
int is_prime_small[maxn_b]; //素数的范围
ll l,u;
//注意a==0的时候需要特判一下
void segment_sieve(ll a,ll b)
{
for(int i=0;(ll)i*i<b;i++) is_prime_small[i]=1;
for(int i=0;i<b-a;i++) is_prime[i]=1;
for(int i=2;(ll)i*i<b;i++)
{
if(is_prime_small[i])
{
for(int j=2*i;(ll)j*j<b;j+=i) is_prime_small[j]=0; //筛选(2,sqrt(b))
for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i)
{
//cout<<"j: "<<j<<endl;
is_prime[j-a]=0;
}
}
}
if(a==1) //*********attention**********
is_prime[0]=0;
/*for(int i=0;i<b;i++)
cout<<is_prime_small[i]<<" ";
cout<<endl;
for(int i=0;i<b-a;i++)
cout<<is_prime[i]<<" ";
cout<<endl;*/
}
void solve(ll a,ll b)
{
ll minl=b-a,maxl=0,max_a,max_b,min_a,min_b;
int k=0;
for(int i=0;i<b-a;i++)
{
if(is_prime[i])
is_prime[k++]=i+a;
}
/*for(int i=0;i<k;i++)
cout<<is_prime[i]<<" ";
cout<<endl;*/
for(int i=1;i<k;i++)
{
ll dis=is_prime[i]-is_prime[i-1];
if(dis>maxl)
{
maxl=dis;
max_a=is_prime[i-1];
max_b=is_prime[i];
}
if(dis<minl)
{
minl=dis;
min_a=is_prime[i-1];
min_b=is_prime[i];
}
}
if(k<=1)
cout<<"There are no adjacent primes."<<endl;
else
cout<<min_a<<","<<min_b<<" are closest, "<<max_a<<","<<max_b<<" are most distant."<<endl;
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>l>>u)
{
segment_sieve(l,u+1);
solve(l,u+1);
}
}