埃氏筛法的一般写法(区间筛法)

问题

[L,R] 之间的素数表。

解法

一个合数 n 的最小素因子不超过 n。因此,在埃氏筛法的过程中,每当“新发现”一个素数 p,可以从 p2 筛起,而不必从 2p 筛起。

先用埃氏筛法求出 [1,R] 上的素数表,再在 [L,R] 上用埃氏筛法求素数。

 

复制代码
const int N(1e5);
bool isprime[N];
int prime[N];
void init() {
    memset(isprime, -1, sizeof isprime);
    isprime[0] = isprime[1] = 0;
    int np = 0;
    for (int i = 0; i < N; i++) {
        if (isprime[i]) {
            prime[np++] = i;
            for (int j = i * i; j < N; j += i)
                isprime[j] = 0;
        }
    }
}
typedef long long ll;
const int M(1e5);
bool ok[M];
int res[M];
int seive(ll l, ll r) {
    assert(1 <= l && l <= r);
    memset(ok, -1, sizeof ok);
    if (l == 1) ok[0] = 0;    //error-prone
    int k = sqrt(r);
    for (int i = 0; prime[i] <= k; i++) {
        ll j = (l + prime[i] - 1) / prime[i] * prime[i];
        j = max(j, (ll) prime[i] * prime[i]);
        for (; j <= r; j += prime[i])
            ok[j - l] = 0;
    }
    int np = 0;
    for (int i = 0; i <= r - l; i++)
        if (ok[i]) res[np++] = i + (ll) l;
    return np;
}
复制代码

 

 

 更新:

不必先把 [2,R] 上的素数存下来。更好的做法是先分别做好 [2,R][L,R] 的表,然后从 [2,R] 的表中筛得素数的同时,也将其倍数从 [L,R] 中划去。

复制代码
const int N = 1e6 + 5, M = sqrt(1e9);

bool is_prime[N];
// 注意:用 sqrt(1e9) + 1 作为数组大小不符合标准, sqrt(1e9) 不是编译期常量,但是 gcc 支持这样做。
bool is_prime_small[M + 1];

void segment_seive(int l, int r) { // [l, r]
    assert(1 <= l && l <= r);
    int t = sqrt(r + 0.5);
    for (int i = 2; i <= t; i++)
        is_prime_small[i] = true;
    for (int i = 0; i <= r - l; i++)
        is_prime[i] = true;
    if (l == 1) is_prime[0] = false;

    for (int i = 2; i <= t; i++)
        if (is_prime_small[i]) {
            for (int j = i * i; j <= t; j += i)
                is_prime_small[j] = false;
            for (int j = max(i * i, (l + i - 1) / i * i); j <= r; j += i)
                is_prime[j - l] = false;
        }
}
复制代码

 

 

 

 

 

 

 

 

 

posted @   Pat  阅读(752)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 智能Agent如何改造传统工作流:从搜索到全能助手
点击右上角即可分享
微信分享提示