lightOJ 1197 Help Hanzo 两阶段素数筛选

来源:互联网 发布:淘宝挤爆了 编辑:程序博客网 时间:2024/05/16 08:08

题目链接:http://lightoj.com/volume_showproblem.php?problem=1197

题意:给你两个整数a,b,让你求在a,b之间的素数的个数,b-a<=100000

思路:先打出在小范围的素数表,在利用小范围的素数,对大的数进行筛选

代码:

#include<stdio.h>#include<string.h>const int MAXN=70000;bool flag[MAXN+10],f[100010];long long p[MAXN+10];long long z;void getPrime(){    long long i,j;    z=0;    memset(flag,true,sizeof(flag));    for (i = 2; i <=MAXN; i++)//求出70000之间的素数    {        if (flag[i])        {            p[z++]=i;            //z++;            for (j = i * i; j <=MAXN; j += i)            {                flag[j]=0;            }        }    }}int main(){int T,kase=0;int cont;    long long m,n,i,sz,k;    getPrime();scanf("%d",&T);    while(T--)    {scanf("%lld%lld",&m,&n);        cont=0;        if(n<70000)        {            for(i=m;i<=n;i++)            {                if(flag[i] && i!=1)  cont++;            }}        else        {if(m<=2) m=2;//注意对m等于1做处理            sz=n-m;            for(i=0;i<=sz;i++) f[i]=true;            for(i=0;i<z && p[i]*p[i]<=n;i++)            {                k=m/p[i];//当m%p[i]==0  && m/p[i]==1,时m为素数,k=1                if(k*p[i]<m) k++;//当m%p[i]!=0时,跳到下一个                if(k<=1) ++k;//跳到下一个                while(k*p[i]<=n)                {                    f[k*p[i]-m]=false;                    ++k;                }            }            for(i=0;i<=sz;i++)            {                if(f[i]) cont++;            }}printf("Case %d: %d\n",++kase,cont);    }    return 0;}


0 0
原创粉丝点击