埃氏筛法

本文介绍了埃氏筛法的基本原理和时间空间复杂度,该方法用于标记并排除素数表中素数的倍数。同时,还讨论了区间筛的应用,它通过先筛出[2,b]内的素数,然后筛选[a,b]区间内的素数,同样具有O(nlogn)的时间复杂度和O(n)的空间复杂度。" 124631988,10426135,Spring AOP实践:XML配置详解,"['Spring框架', 'Java', '后端开发', '面向切面编程', 'XML配置']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

埃氏筛

埃氏筛的原理就是每次在素数表中将素数 p p p的倍数划去,实现简单。

时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)

空间复杂度: O ( n ) O(n) O(n)

int prime[N], kp;
bool is_prime[N];
void sieve(int k){
    for (int i = 0; i <= k; ++ i) is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    kp = 0;
    for (int i = 2; i <= k; ++ i) if (is_prime[i]){
        prime[kp ++] = i;
        for (int j = i + i; j <= k; j += i) is_prime[j] = false;
    }
}

区间筛

用途:筛出区间 [ a , b ] [a, b] [a,b]中的素数。

注意到区间 [ a , b ] [a, b] [a,b]内的合数的最小质因子一定在 [ 2 , b ] [2, \sqrt{b}] [2,b ]内,所以先用埃氏筛筛出 [ 2 , b ] [2, \sqrt{b}] [2,b ]内素数,再用这些素数去筛 [ a , b ] [a, b] [a,b]区间内的素数。

时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)

空间复杂度: O ( n ) O(n) O(n)

int prime[N], kp;
bool is_prime[N], seg_prime[N];
void seg_sieve(LL l, LL r){
    for (LL i = 0; i * i <= r; ++ i) is_prime[i] = true;
    for (LL i = l; i <= r; ++ i) seg_prime[i - l] = true;
    is_prime[0] = is_prime[1] = false;
    for (LL i = 2; i * i <= r; ++ i) if (is_prime[i]){
        for (LL j = i + i; j * j <= r; j += i) is_prime[j] = false;
        for (LL j = max(2ll, (l + i - 1) / i) * i; j <= r; j += i)
            seg_prime[j - l] = false;
    }
    kp = 0;
    if (l <= 0 && 0 <= r) seg_prime[0 - l] = false;       // 特判0
    if (l <= 1 && 1 <= r) seg_prime[1 - l] = false;       // !!! 特别提醒要特判1
    for (LL i = l; i <= r; ++ i) if (seg_prime[i - l])
        prime[kp ++] = i;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值