一、埃式筛法(终极版)筛出1~n的所有非素数
const int maxn = 1e8+10;
bitset<maxn>pri; //bitser与bool类似,默认falsh值
void ais(int n) //筛出的是非素数
{
for(int i=2;i<=n/i;i++) //从2开始筛到n/i;
{
if(!pri[i])
for(int j=i*i;j<=n;j+=i) //遍历i的所有倍数
pri[j] = 1; //标记i的倍数
}
}
二、欧拉筛法 筛出1~n的所有素数
bitset<maxn>pri; //筛表
int primes[maxn]; //存储素数
void ols(int n) //筛出素数
{
int pp = 0;
for(int i=2;i<=n;i++)
{
if(!pri[i]) primes[++pp] = i;
for(int j=1;primes[j]*i <= n;j++)
{
pri[primes[j]*i] = 1; //素数(j)* i 标为非素数
if(i % primes[j] == 0) break; //防止重复筛
}
}
return ;
}
例题:P3383 【模板】线性筛素数