线性质数筛

登录以参加训练计划

课件

线性筛法(欧拉筛法)

基本思想

线性筛法(欧拉筛法)可以在 O(n) 的时间复杂度内筛选出 n 以内的所有素数。

算法原理

const int MAXN = 1e7 + 5, MR = 1e6 + 5;
bool isprime[MAXN];
int prime[MR];

void init() {
    memset(isprime, true, sizeof(isprime));
    isprime[0] = isprime[1] = false;
    for (int i = 2; i <= MAXN; i++) {
        if (isprime[i]) {
            prime[++prime[0]] = i;
        }
        for (int j = 1; j <= prime[0] && i * prime[j] <= MAXN; j++) {
            isprime[i * prime[j]] = false;
            if (i % prime[j] == 0) break;
        }
    }
}

关键点

  • prime[0] 存储素数的个数
  • 每个合数只被它的最小质因子筛一次
  • 时间复杂度 O(n)

章节 1. 课上讲解

开放

题目 尝试 AC 难度
P3383   【模板】线性筛素数 1 1 10
P3912   素数个数 1 0 10
 
参加人数
3
创建人