POJ 2689 Prime Distance [素数筛+想法]

来源:互联网 发布:c语言浮点数表示方法 编辑:程序博客网 时间:2024/05/18 20:47

题意:给出[L,R]的区间,问这个区间内相邻素数的最大距离和最小距离

题解:小于2147483647的素数用到的小素数,只有sqrt(2147483,647)个,我们只要枚举这些素数,筛掉合数就可以得到这个区间的所有素数。

AC代码:

#include<stdio.h>#include<string.h>#include<iostream>#define N 1000005using namespace std;bool f[N];int b[N],top;bool ff[N];int main(){memset(f,true,sizeof(f));f[0]=f[1]=false;for(int i=2;i<N;i++){if(f[i]){b[top++]=i;for(int j=2;i*j<N;j++)f[j*i]=false;}}int l,r;while(~scanf("%d%d",&l,&r)){memset(ff,true,sizeof(ff));for(int i=0;i<top;i++)for(int j=l/b[i];j<=r/b[i];j++)if(j*b[i]>=l&&j*b[i]<=r&&j!=1)ff[j*b[i]-l]=false;int last=0;while((l+last<N&&!f[l+last])||(!ff[last]&&last<=r-l))last++;int ma=0,mi=10000000;int ma1=-1,ma2=-1,mi1=-1,mi2=-1;for(int i=last+1;i<=r-l;i++){if(ff[i]){if(l+i<N)if(!f[l+i])continue;int len=i-last;if(ma<len){ma1=last;ma2=i;ma=len;}if(mi>len){mi1=last;mi2=i;mi=len;}last=i;}}if(ma1==-1)printf("There are no adjacent primes.\n");else printf("%d,%d are closest, %d,%d are most distant.\n",mi1+l,mi2+l,ma1+l,ma2+l);}}