120_区间埃氏筛

来源:互联网 发布:招募淘宝分销商的语句 编辑:程序博客网 时间:2024/05/17 09:45

 区间埃氏筛, 求[a,b)之间的素数的个数。 先对[2,sqrt(b)]筛, 用其素数表对[a,b)筛。

 其中注意一个问题,大于等于a的i的倍数的求法:(a+i-1)/i*i


 

////  121_prime.cpp//  changlle////  Created by user on 1/4/16.//  Copyright (c) 2016 user. All rights reserved.//#include <iostream>#include <algorithm>#include <math.h>using namespace std;typedef long long ll;const ll inf=200000;bool is_prime[inf];bool is_prime_small[inf];//ll prime[inf];void segment_sieve (ll a, ll b) {        fill (is_prime, is_prime+inf, true);    fill (is_prime_small, is_prime_small+inf, true);    is_prime_small[0]=is_prime_small[1]=false;    is_prime[0]=is_prime[1]=false;        for (ll i=0; i*i<b;i++){                if (is_prime_small[i]){            for (ll j=2*i; (ll)j*j<b;j+=i)                is_prime_small[j]=false;            for (ll j=max(2ll, (a+i-1)/i)*i; j<b;j+=i)                is_prime[j-a]=false;        }                    }    }int main() {        ll a=22801763489;    ll b=22801787297;    segment_sieve(a, b);        int p=0;        for (ll i=0; i<=b-a;i++)        if (is_prime[i]) p++;        cout<<p<<endl;        return 0;}

0 0