POJ2689
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=1000006;
bool ha[maxn]={false};
int prime[maxn];
int cnt=0;
void Prime(void)
{
ha[1]=true;
for(int i=2;i<maxn;i++)
{
if(!ha[i]) prime[cnt++]=i;
for(int j=0;j<cnt&&prime[j]<=maxn/i;j++)
{
ha[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
return ;
}
int prime2[maxn];
int cnt2;
int l,r;
bool haa[maxn];
void _ha(void)
{
memset(haa,0,sizeof(haa));
int rr=sqrt(r*1.0);
if(l<2) l=2;//1不是素数
cnt2=0;
for(int i=0;i<cnt&&prime[i]<=rr;i++)
{
int z=l/prime[i]+(l%prime[i]!=0);
if(z==1) z++;//本身是素数
for(int j=z;(ll)j*prime[i]<=r;j++)
if(j*prime[i]>=l) haa[j*prime[i]-l]=true;
}
for(int i=0;i<=r-l;i++)
{
if(haa[i]==false)
{
prime2[cnt2++]=i+l;
//printf("Prime2: %d\n",i+l);
}
}
return ;
}
int main(void)
{
Prime();
while(scanf("%d%d",&l,&r)!=EOF)
{
_ha();
if(cnt2<2)
{
printf("There are no adjacent primes.\n");
continue;
}
int a1,a2,b1,b2;
int minn=10000000;
int maxn=0;
for(int i=1;i<cnt2;i++)
{
if(prime2[i]-prime2[i-1]>maxn)
{
maxn=prime2[i]-prime2[i-1];
a1=prime2[i],a2=prime2[i-1];
}
if(prime2[i]-prime2[i-1]<minn)
{
minn=prime2[i]-prime2[i-1];
b1=prime2[i],b2=prime2[i-1];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",b2,b1,a2,a1);
}
return 0;
}