素数筛
1.朴素筛法O(nlogn)
void get_primes(int n){
for(int i = 2;i <= n; ++i){
if(!st[i]){
prime[cnt++] = i;
}
for(int j = i + i;j <= n;j += i)st[j] = true;
}
}
2.埃氏筛法O(
n
l
o
g
l
o
g
n
nloglogn
nloglogn)
void get_primes(int n){
for(int i = 2;i <= n; ++i){
if(!st[i]){
prime[cnt++] = i;
for(int j = i + i;j <= n;j += i)st[j] = true;
}
}
}
3.欧拉(线性)筛法O(n)
int cnt;
int v[N];
int prime[N];
void get_primes(int n){
for(int i = 2;i <= n; ++i){
if(v[i] == 0){
v[i] = i;
prime[++cnt] = i;
}
for(int j = 1 ; j <= cnt;++j){
if(prime[j] > v[i] || i * prime[j] > n) break;
v[prime[j] * i] = prime[j];
}
}
}