邝斌的ACM模板(素数)

来源:互联网 发布:hamilton回路算法 编辑:程序博客网 时间:2024/09/21 09:23

本博客整理自邝斌的ACM模板
2.1、素数
2.1.1 素数筛选(判断

/* * 素数筛选,判断小于MAXN的数是不是素数。 * notprime是一张表,为false表示是素数,true表示不是素数 */const int MAXN=1000010;bool notprime[MAXN];//值为false表示素数,值为true表示非素数void init(){    memset(notprime,false,sizeof(notprime));    notprime[0]=notprime[1]=true;    for(int i=2; i<MAXN; i++)        if(!notprime[i])        {            if(i>MAXN/i)continue;//防止后面i*i溢出(或者i,j用long long)            //直接从i*i开始就可以,小于i倍的已经筛选过了,注意是j+=i            for(int j=i*i; j<MAXN; j+=i)                notprime[j]=true;        }}

2.1.2 素数筛选(筛选出小于等于 MAXN 的素数)

/* * 素数筛选,存在小于等于MAXN的素数 * prime[0] 存的是素数的个数 */const int MAXN=10000;int prime[MAXN+1];void getPrime(){    memset(prime,0,sizeof(prime));    for(int i=2; i<=MAXN; i++)    {        if(!prime[i])prime[++prime[0]]=i;        for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++)        {            prime[prime[j]*i]=1;            if(i%prime[j]==0) break;        }    }}

2.1.3 大区间素数筛选(POJ 2689)

/* * POJ 2689 Prime Distance * 给出一个区间[L,U],找出区间内容、相邻的距离最近的两个素数和 * 距离最远的两个素数。 * 1<=L<U<=2,147,483,647 区间长度不超过1,000,000 * 就是要筛选出[L,U]之间的素数 */#include <stdio.h>#include <algorithm>#include <iostream>#include <string.h>using namespace std;const int MAXN=100010;int prime[MAXN+1];void getPrime(){    memset(prime,0,sizeof(prime));    for(int i=2; i<=MAXN; i++)    {        if(!prime[i])prime[++prime[0]]=i;        for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++)        {            prime[prime[j]*i]=1;            if(i%prime[j]==0)break;        }    }}bool notprime[1000010];int prime2[1000010];void getPrime2(int L,int R){    memset(notprime,false,sizeof(notprime));    if(L<2)L=2;    for(int i=1; i<=prime[0]&&(long long)prime[i]*prime[i]<=R; i++)    {        int s=L/prime[i]+(L%prime[i]>0);        if(s==1)s=2;        for(int j=s; (long long)j*prime[i]<=R; j++)            if((long long)j*prime[i]>=L)                notprime[j*prime[i]-L]=true;    }    prime2[0]=0;    for(int i=0; i<=R-L; i++)        if(!notprime[i])            prime2[++prime2[0]]=i+L;}int main(){    getPrime();    int L,U;    while(scanf("%d%d",&L,&U)==2)    {        getPrime2(L,U);        if(prime2[0]<2)printf("There are no adjacent primes.\n");        else        {            int x1=0,x2=100000000,y1=0,y2=0;            for(int i=1; i<prime2[0]; i++)            {                if(prime2[i+1]-prime2[i]<x2-x1)                {                    x1=prime2[i];                    x2=prime2[i+1];                }                if(prime2[i+1]-prime2[i]>y2-y1)                {                    y1=prime2[i];                    y2=prime2[i+1];                }            }            printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,y1,y2);        }    }}