正题
题目链接:http://poj.org/problem?id=2689
题目大意
求闭区间[L,R][L,R]中相邻的最远和最近的两个质数。
解题思路
我们可以用前R−−√个质因子筛这个区间内的质数R个质因子筛这个区间内的质数
解题思路
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 1000010
using namespace std;
int l,r,ok[N],uok[N],prime[N],tot,pre,mark1,mark2,makr1,makr2,i;
int main()
{while(scanf("%d%d",&l,&r)==2){int t=sqrt(r);tot=0;for(i=2;i<=t;i++)//筛前根号R个{if(!ok[i]){prime[++tot]=i;for(int j=2*i;j<=t;j+=i)ok[j]=true;}}memset(uok,0,sizeof(uok));for(i=1;i<=tot;i++)//筛这个范围内的{int &a=prime[i],L=l/a,R=r/a;if(l%a) L++;for(int j=L;j<=R;j++)if(a*j!=prime[i])uok[a*j-l]=true;}if(l==1)uok[0]=1;for(i=0;i<=r-l&&uok[i];i++);pre=i;makr1=-2147483647/3;makr2=2147483647/3;mark1=0;mark2=0;bool flag=false;for(i++;i<=r-l;i++)//寻找最近和最远{if(!uok[i]){ if(mark2-mark1<i-pre){mark2=i+l;mark1=pre+l;}if(makr2-makr1>i-pre){makr2=i+l;makr1=pre+l;}flag=true;pre=i;}}if(flag)printf("%d,%d are closest, %d,%d are most distant.\n",makr1,makr2,mark1,mark2);elseprintf("There are no adjacent primes.\n");}
}