埃氏筛、欧拉筛、质因数分解

欧拉筛

O(n)O(n)

注意欧拉筛从0开始存储

// C++ Version
void init() {
  for (int i = 2; i < MAXN; ++i) {
    if (!vis[i]) {
      pri[cnt++] = i;
    }
    for (int j = 0; j < cnt; ++j) {
      if (1ll * i * pri[j] >= MAXN) break;
      vis[i * pri[j]] = 1;
      if (i % pri[j] == 0) {
        // i % pri[j] == 0
        // 换言之,i 之前被 pri[j] 筛过了
        // 由于 pri 里面质数是从小到大的,所以 i 乘上其他的质数的结果一定也是
        // pri[j] 的倍数 它们都被筛过了,就不需要再筛了,所以这里直接 break
        // 掉就好了
        break;
      }
    }
  }
}

埃氏筛

O(nloglogn)O(nloglogn)

可进一步优化

nloglogn\sqrt{n}loglog\sqrt{n}

质因数分解

预处理出从1—MAXN的质因子,时间复杂度nlogn

Last updated