数论基础1009 LightOJ 1197

来源:互联网 发布:xmind8 mac破解序列号 编辑:程序博客网 时间:2024/06/16 19:04

题意:
求a~b有多少个素数
思路:
用类似筛法的方法来判断0~b-a之间来得到答案
先找到每个素数在a~b里的第一个是该素数的>=2倍的位置,然后筛
最后剩下的一定是素数,时间O(b-a)
素数区间是[0,2^16)

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<string>#include<vector>#include<map>#include<set>using namespace std;#define lowbit(x) (x&(-x))typedef long long LL;const int maxn = 100005;const int inf=(1<<28)-1;#define maxp 500005bool notprime[maxp];int primes[maxp];void get_prime(){    notprime[1]=true;    for(int i=2;i<maxp;++i)    if(!notprime[i])    {        primes[++primes[0]]=i;        for(LL j=(LL)i*i;j<maxp;j+=i)        notprime[j]=true;    }}int Num[maxn];int main(){    get_prime();    int T,Case=0;    scanf("%d",&T);    while(T--)    {        int a,b;        scanf("%d%d",&a,&b);        memset(Num,0,sizeof(Num));        int Ans=0;        for(int i=1;primes[i]*primes[i]<=b&&i<=primes[0];++i)        {            int pos=0;            if(a%primes[i])            pos+=primes[i]-a%primes[i];            if(a<=primes[i])            pos+=primes[i];            for(int j=pos;j<=b-a;j+=primes[i])            Num[j]=1;        }        for(int i=0;i<=b-a;++i)        Ans+=!Num[i];        if(a==1) Ans--;        printf("Case %d: %d\n",++Case,Ans);    }    return 0;}
0 0