LightOJ 1197 Help Hanzo

来源:互联网 发布:局域网网络管理器 编辑:程序博客网 时间:2024/06/04 18:03

思路:大区间素数筛
筛法用的kuangbin的模板

#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>using namespace std;typedef long long ll;const int MAXN=1000010;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;}bool isPrime(ll num){    if(num == 1)        return false;    for(ll i = 2; i*i <= num; ++i)        if(num%i == 0)            return false;    return true;}int main(){    getPrime();    int t,res,time = 0;    ll l,r;    cin >> t;    while(t--)    {        cin >> l >> r;        if(r <= MAXN)        {            int *e = lower_bound(prime+1,prime+1+prime[0],r);            int *s = lower_bound(prime+1,prime+1+prime[0],l);            if(*e > r) --e;            res = e-s+1;            cout << "Case " << ++time << ": " << res <<endl;        }        else        {            getPrime2(l,r);            cout << "Case " << ++time << ": " << prime2[0] << endl;        }    }    return 0;}
0 0
原创粉丝点击