欧拉筛模板题:https://www.luogu.com.cn/problem/P3383
欧拉筛之前看过,但是后来长时间没用就忘记了
筛素数的筛法有两个,埃氏筛和欧拉筛
埃氏筛的原理就是:质数的倍数一定不是倍数
代码段
void E_sieve(int n){
for(int i=0;i<=n;i++){
v[i]=false;
}
for(int i=2;i*i<=n;i++){
if(!v[i]){
for(int j=i*i;j<=n;j+=i){
v[j]=true;
}
}
}
int cnt=0;
for(int i=2;i<=n;i++){
if(!v[i]){
prime[++cnt]=i;
}
}
}
但是埃氏筛的代码过程还是有重复,比如说20,20同时是2的倍数和5的倍数,而2和5都是质数,但是在埃氏筛的代码就出现了反复
所以出现了改进——欧拉筛
int Oula_prime(){
memset(v,0,sizeof(v));
cnt=0;
v[0]=v[1]=1;
for(int i=1;i<=n;i++){
if(!v[i]){
prime[++cnt]=i;
}
for(int j=1;j<=cnt&&i*prime[j]<=n;i++){
v[i*prime[j]]=1;
if(i%prime[j]==0){
break;
}
}
}
}