质数筛 $ O(N) $
原理:保证每个数都是被其最小的质因数筛去
证明:
当 i%prime[j]==0时,由于质数从小到大枚举,因此prime[j]必定是i的最小质因数,也必定是i*prime[j]最小质因数 当i%prime[j]!=0时,也可以发现仍然为最小质因数
cpp
//写法一
int primes[N], cnt; // primes[]存储所有素数
bool st[N]; // st[x]存储x是否被筛掉
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if (!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
//写法二
std::vector<int> minp, primes;
void sieve(int n) {
minp.assign(n + 1, 0);
primes.clear();
for (int i = 2; i <= n; i++) {
if (minp[i] == 0) {
minp[i] = i;
primes.push_back(i);
}
for (auto p : primes) {
if (i * p > n) {
break;
}
minp[i * p] = p;
if (p == minp[i]) {
break;
}
}
}
}