线性筛模板

Posted saionjisekai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性筛模板相关的知识,希望对你有一定的参考价值。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 const int N=1e5+10;
 6 int Min[N],zs[N],cnt=0,n,phi[N];
 7 void prime(int n){
 8     memset(Min,0,sizeof(Min));
 9     for(int i=2;i<=n;i++){
10         if(Min[i]==0){
11             Min[i]=i;//自己是自己的最小质数 
12 //            phi[i]=i-1;
13             zs[++cnt]=i;
14         }
15         for(int j=1;j<=cnt;j++){//当前质数*小于等于自己的质数来筛合数(当然别筛过了) 
16             if(Min[i]<zs[j]||zs[j]>n/i){//当前i的最小质因数比自己小或乘出来会越界 
17 //                phi[i*zs[j]]=phi[i]*zs[j];//说明phi[i*zs[j]]时定会有不止一个zs[j],欧拉函数顺手乘上这个质数就好 
18                 break;
19             }
20 //            phi[zs[j]*i]=phi[i]*(zs[j]-1);//若这个质数j与i互质,则phi[i*zs[j]]=phi[i]*phi[zs[j]]=phi[i]*(zs[j]-1) 
21             Min[zs[j]*i]=zs[j];//乘出来的合数最小值肯定为小于等于自己的那个质数
22         }
23     }
24     for(int i=1;i<=cnt;i++)
25         printf("%d ",zs[i]);//打印质数 
26 }
27 int main(){
28     scanf("%d",&n);
29     prime(n);
30     return 0;
31 }

 

以上是关于线性筛模板的主要内容,如果未能解决你的问题,请参考以下文章

模板 - 数论 - 线性筛

普及组模板——线性筛素数

P3383 模板线性筛素数

模板欧拉筛法(线性筛法)

线性筛素数模板

模板线性筛求素数