区间素数的筛选 得到区间素数的个数和值

来源:互联网 发布:超级课程表 知乎 编辑:程序博客网 时间:2024/06/06 18:12
int prime[maxn],notprime[maxn],cnt=0,ans=0,prime2[maxn];///cnt打表素数的个数,ans为区间[L,R]的素数的个数,prime2[maxn]从角标1开始存储区间素数的值;void getprime1(){    memset(prime,0,sizeof(prime));    for(int i=2;i<=maxn;i++)    {        if(!prime[i]) prime[++cnt]=i;        for(int j=1;j<=cnt;j++)        {            if(i*prime[j]>=maxn) break;            prime[i*prime[j]]=1;            if(i%prime[j]==0) break;        }    }}void getprime2(int L,int R){    ans=0;    memset(notprime,false,sizeof(notprime));    if(L<2) L=2;    for(int i=1;i<=cnt&&prime[i]*prime[i]<=R;i++)    {        LL temp=L/prime[i]+(L%prime[i]>0);        if(temp==1) temp=2;        for(LL j=temp;j*prime[i]<=R&&j*prime[i]>=L;j++) notprime[j*prime[i]-L]=true;    }    for(LL i=0;i<=R-L;i++) if(!notprime[i]) prime2[++ans]=i+L;}
原创粉丝点击