Help Hanzo(素数筛)

来源:互联网 发布:kernel task 上传数据 编辑:程序博客网 时间:2024/05/24 03:55

题意:本题就是求l~u之间有多少个素数;

分析:因为题数很大,所以不能用正常的素数筛法,只能先筛一部分,在用这些素数再筛出l~u之间的素数。本题和另一道题目很相似(传送门);

另一道题题目链接:http://poj.org/problem?id=2689;

由于不是很难,我就不赘述怎么进行素数筛,详情请见博客:http://blog.csdn.net/qq_27599517/article/details/50858790;

代码如下:

#include <set>#include <map>#include <stack>#include <queue>#include <math.h>#include <vector>#include <utility>#include <string>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <functional>using namespace std;const int N=50005;bool isprime[N*20];long long prime_1[N];long long prime_2[N];long long l,u;int prime_num=0;void prime1(){    memset(isprime,1,sizeof(isprime));    isprime[1]=isprime[0]=false;    for(int i=2;i<N;i++){        if(isprime[i])        prime_1[prime_num++]=i;        for(int j=0;j<prime_num&&i*prime_1[j]<N;j++){            isprime[i*prime_1[j]]=false;            if(!(i*prime_1[j]))break;        }    }}// 线性筛法int prime_num_2;void prime2(){    long long i,j,b;    memset(isprime,1,sizeof(isprime));    for(i=0;i<prime_num;i++){        b=l/prime_1[i];        while(b*prime_1[i]<l||b<=1)        b++;        for(j=b*prime_1[i];j<=u;j+=prime_1[i]){            if(j>=l){                isprime[j-l]=false;            }        }        if(l==1){            isprime[0]=false;        }    }}//普通筛法int main(){    prime1();    int t;    cin>>t;    int m=1;    while(t--){        scanf("%lld%lld",&l,&u);        prime2();        prime_num_2=0;        for(int i=0;i<=u-l;i++){            if(isprime[i]){                prime_num_2++;            }        }        printf("Case %d: %lld\n",m++,prime_num_2);    }}


0 0
原创粉丝点击