[题解](区间质数筛)POJ_2689 Prime Distance

区间筛素数:先筛出1~sqrt(R)的素数,然后对于每个询问只要用这些素数筛掉区间内的合数即可。

几个细节:
1.特判和1有关的一些情况

2.每次减去L偏移量,数组只开区间大小

3.POJ无法使用万能头文件(需要火星救援(大雾

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int prime[50009];
bool ck[1000009],tmp[1000009];
int l,r,tot;
int main(){
    for(int i=2;i<=50005;i++){
        if(!ck[i])prime[++tot]=i;
        for(int j=1;j<tot;j++){
            if(i*prime[j]>50005)break;
            ck[i*prime[j]]=1;
            if(i%prime[j]==0)break;
        }
    }
    while(scanf("%d%d",&l,&r)!=EOF){
        if(l==1)l=2;//特判 
        memset(tmp,0,sizeof(tmp));
        for(int i=1;i<=tot;i++){
            int a=(l-1)/prime[i]+1;
            int b=r/prime[i];
            a=max(2,a);
            for(int j=a;j<=b;j++)
            tmp[j*prime[i]-l]=1;//减去l映射 
        }
        int lst=-1,minans=0x7fffffff,maxans=0,xa,ya,xb,yb;
        for(int i=0;i<=r-l;i++){
            if(!tmp[i]){
                if(lst==-1){lst=i;continue;}
                if(maxans<i-lst)
                maxans=i-lst,xa=lst+l,ya=i+l;
                if(minans>i-lst)
                minans=i-lst,xb=lst+l,yb=i+l;
                lst=i;
            }
        }
        if(maxans==0)printf("There are no adjacent primes.\n");
        else printf("%d,%d are closest, %d,%d are most distant.\n",xb,yb,xa,ya);
    }
}

猜你喜欢

转载自www.cnblogs.com/superminivan/p/10846146.html