题目:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#define LL long long
#define mem(a, b) memset(a, b, sizeof(a))
#define N 50000
#define MOD 1000000007
using namespace std;
int l, r, m;
int v[N+10], prime[N], prime2[1000010], not_prime[1000010];
void pre_primes() {
for(int i=2; i<=N; i++) {
if(v[i]==0) {
v[i]=i; prime[++m]=i;
}
for(int j=1; j<=m; j++) {
if(prime[j]>v[i] || prime[j]>N/i) break;
v[i*prime[j]]=prime[j];
}
}
}
void primes() {
for(int i=1; i<m; i++) {
int p=l/prime[i];
if(p<=1) p=2;
for(LL j=(LL)prime[i]*p; j<=r; j+=(LL)prime[i]) {
if(j>=l) not_prime[j-l]=1;
}
}
if(l==1) not_prime[0]=1;
}
int main() {
pre_primes();
while(scanf("%d%d", &l, &r)!=EOF) {
int num=0;
mem(not_prime, 0);
primes();
for(int i=0; i<=r-l; i++) {
if(!not_prime[i])
prime2[++num]=i+l;
}
if(num<=1) {
printf("There are no adjacent primes.\n");
continue;
}
int maxx=0, minn=1000000, maxl, maxr, minl, minr;
for(int i=2; i<=num; i++) {
if(prime2[i]-prime2[i-1]>maxx) {
maxx=prime2[i]-prime2[i-1];
maxl=prime2[i-1];
maxr=prime2[i];
}
if(prime2[i]-prime2[i-1]<minn) {
minn=prime2[i]-prime2[i-1];
minl=prime2[i-1];
minr=prime2[i];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",minl,minr,maxl,maxr);
}
}