POJ2689 Prime Distance

来源:互联网 发布:python 开发GIS 编辑:程序博客网 时间:2024/05/29 16:33

筛法

题目传送门

POJ维护后第一天啦啦啦
要筛2311范围内的数,只需要筛2311(46341)以内的素数即可。然后根据这些素数去筛L~U之间的数即可。

4e4+7比较小,一般的筛法就可以了。

代码:

#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 1000000#define MAXM 100010#define MAX 80000#define INF 1e12using namespace std;typedef long long LL;LL l,r,p;LL prime[MAXN+5],pr[MAXN+5];bool f[MAXN+5];void Make(){    memset(f,true,sizeof(f));    for (LL i=2;i<=MAXM;i++){        if (f[i]) prime[++p]=i;        for (LL j=1;j<=p&&prime[j]*i<=MAXM;j++){            f[prime[j]*i]=false;            if (i%prime[j]==0) break;        }    }}int main(){    Make();    while (scanf("%lld%lld",&l,&r)==2){        memset(f,true,sizeof(f));        if (l<2) l=2;         for (LL i=1;i<=p;i++){            LL k=l/prime[i];            if (l%prime[i]) k++;            if (k==1) k++;            for (LL j=prime[i]*k;j<=r;j+=prime[i])                if (j>=l)                    f[j-l+1]=false;        }        LL al=0,ar=0,il=0,ir=1e10,t=0;        for (LL i=1;i<=r-l+1;i++)            if (f[i])                pr[++t]=i+l-1;        if (t<=1){            printf("There are no adjacent primes.\n");            continue;        }        for (LL i=1;i<t;i++){            if (pr[i+1]-pr[i]<ir-il){                il=pr[i]; ir=pr[i+1];            }            if (pr[i+1]-pr[i]>ar-al){                al=pr[i]; ar=pr[i+1];            }        }        printf("%lld,%lld are closest, %lld,%lld are most distant.\n",il,ir,al,ar);    }    return 0;}
原创粉丝点击