AC代码
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=1000010;
int n,m;
int a[N];
int prime[N],cnt,vis[N];
void EulerFilter(){
for(int i=2;i<=N;i++){
if(!vis[i]){
prime[cnt++]=i;
}
for(int j=0;j<cnt;j++){
if(i*prime[j]>N)
break;
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
void work(){
for(int i=0;i<cnt;i++){
LL pr=prime[i],sta=n;
if(pr>=n) sta=2*pr;
else if(n%pr!=0) sta=n/pr*pr+pr;
for(LL i=sta;i<=m;i+=pr){
a[i-n]=0;
}
}
}
void find(){
int maxi=0,maxj=0,max=-1e5;
int mini=0,minj=0,min=1e5;
int sum=0,end=0;
for(LL i=n;i<=m;i++){
if(a[i-n] && i>1){
sum+=1;
end=i;
}
}
if(sum<2){
printf("There are no adjacent primes.\n");
}
else{
for(LL i=end-1;i>=n;i--){
if(a[i-n] && i>1){
int sub=end-i;
if(sub>=max){
maxi=i;
maxj=end;
max=sub;
}
if(sub<=min){
mini=i;
minj=end;
min=sub;
}
end=i;
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",mini,minj,maxi,maxj);
}
}
int main(){
EulerFilter();
while(cin>>n>>m){
for(LL i=n;i<=m;i++){
a[i-n]=1;
}
work();
find();
}
return 0;
}