POJ 2689 (素数的二次筛选)

来源:互联网 发布:王者传奇羽毛升级数据 编辑:程序博客网 时间:2024/05/20 07:50

poj 2689 Prime Distance (素数筛选的经典应用)

题意:给出一个区间,长度<=1000 000;求其中素数相邻素数之间的差最小的和最大的;

算法:素数筛选

其中区间的数可能较大,因此如果用试除法的话,显然不行的;

用筛选法,首先第一次筛选出从1到47000之间的素数;第二次筛选时,利用第一次筛

选出来的素数,判断L到U区间范围内的数是否是素数;

因为范围是1<=L< U<=2,147,483,647,而U-L<=1000 000;所以我们可以设置一个1000000

以内的数组,用res[i-L]的值为0或者1来表示是否是素数;

核心算法是第二次的筛选,其中j=begin*prime[i]表示的是在A,B区间中prime[i]的第一个倍数;依次筛选;


/************** POJ 2689*************/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int SIZE = 50000;long long L, U;int yes[SIZE];long long prim[SIZE];int k=0;int adp[1001000];void getPrim(){    memset(yes,0,sizeof(yes));    for(long long i=2;i<SIZE;i++)        if(!yes[i])        {            prim[k++]=i;            for(long long j=i*i;j<SIZE;j+=i)                yes[j]=1;        }}int main(){    long long pre;    long long maxV, u1, v1;    long long minV, u2, v2;    int flag;    getPrim();    while(cin>>L>>U)    {        if(L<=1) L=2;                //二次筛选过程        memset(adp,0,sizeof(adp));        for(int i=0;i<k&&prim[i]*prim[i]<=U;i++)        {            long long beg=L/prim[i]+(L%prim[i]>0);            if(beg==1) beg++;            for(long long j=beg*prim[i];j<=U;j+=prim[i])  //调整j,使得 L<=j<=U                adp[j-L]=1;        }        maxV=-2*SIZE;        minV=2*SIZE;        flag=0;        for(long long i=L;i<=U;i++)        {            if(!adp[i-L])            {                flag++;                if(flag>1)                {                    int temp=i-pre;                    if(temp>maxV) {maxV=temp; u1=pre; v1=i;}                    if(temp<minV) {minV=temp; u2=pre; v2=i;}                }                pre=i;            }        }        if(flag>1)            cout<<u2<<","<<v2<<" are closest, "<<u1<<","<<v1<<" are most distant.\n";        else            cout<<"There are no adjacent primes.\n";    }    return 0;}/*1 22146483648 21474836472147483047 2147483647There are no adjacent primes.2146483811,2146483813 are closest, 2146841093,2146841273 are most distant.2147483053,2147483059 are closest, 2147483179,2147483237 are most distant.*/


原创粉丝点击