区间筛选素数
#include <iostream>
using namespace std;
#define ll long long
#define inf 999999999
#define maxn 50001
bool prime[maxn];
bool flag[1000001];
void findprime()
{
memset(prime,true,sizeof(prime));
prime[0]=false;
prime[1]=false;
for(int i=2;i*i<maxn;++i)
{
if(prime[i])
{
for(int j=i*i;j<maxn;j+=i)
{
prime[j]=false;
}
}
}
}
int main()
{
findprime();
ll l,u,min,max,minl,minh,maxl,maxh,dist,t;
while(cin>>l>>u)
{
memset(flag,true,sizeof(flag));
min=inf; max=-1;
for(ll i=2;i*i<=u;++i)
{
if(prime[i])
{
if(l/i<2) t=i;
else t=l/i;
for(ll j=t*i;j<=u;j+=i)
{
if(j>=l&&j<=u) flag[j-l]=false;
}
}
}
if(l==1) flag[0]=false;
for(ll i=1,j=0;i<=u-l;++i)
{
if(flag[i])
{
if(j==0&&!flag[0]) j=i;
else
{
dist=i-j;
if(dist<min)
{
min=dist;
minl=j+l;
minh=i+l;
}
if(dist>max)
{
max=dist;
maxl=j+l;
maxh=i+l;
}
j=i;
}
}
}
if(max<0) cout<<"There are no adjacent primes."<<endl;
else cout<<minl<<','<<minh<<" are closest, "<<maxl<<','<<maxh<<" are most distant."<<endl;
}
return 0;
}