欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了。
埃筛的基本思想是:素数的倍数一定是合数。
欧拉筛基本思想是:任何数与素数的乘积一定是合数
算法概述:
遍历[2, n]
的所有数i
,内层循环遍历已经找到的素数prime[j]
,将i * prime[j]
标记为合数。
内层循环的最后,检查如果prime[j]
是i
的最小质因子,则退出到外层循环,因为prime[j+1] * i
肯定已经被筛过了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e7 + 5;
int isPrime[MAXN]; // isPrime[i] 表示i是否素数
int prime[MAXN