线性筛筛素数:

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e7; 4 bool vis[maxn]; 5 int prime[maxn]; 6 int f(int n)//计算从1到n的素数个数 7 { 8 int cnt =0; 9 memset(vis,false,sizeof(vis)); 10 for(int i=2;i<=n;i++) 11 { 12 if(!vis[i]) 13 prime[cnt++] = i; 14 for(int j=0;j<cnt && i*prime[j]<=n;j++) 15 { 16 vis[i*prime[j]]=1; 17 if(i%prime[j]==0) 18 break; 19 } 20 } 21 return cnt; 22 } 23 /*当 i 能整除 prime[j] 24 那么 i*prime[j+1] 这个合数肯定被 prime[j] 乘以某个数筛掉。 25 因为i中含有prime[j], prime[j] 比 prime[j+1] 小。*/ 26 27 int main () 28 { 29 int n;cin>>n; 30 cout<<f(n)<<endl; 31 return 0; 32 }
线性筛筛欧拉函数:

1 void getxxs(int N){ 2 for(int i=2;i<=N;i++){ 3 v[i]=1; 4 } 5 for(int i=2;i<=N;i++){ 6 if(v[i]){ 7 prime[++num]=i; 8 phi[i]=i-1; 9 } 10 for(int j=1;i*prime[j]<=N&&j<=num;j++){ 11 v[i*prime[j]]=0; 12 if(i%prime[j]==0){ 13 phi[i*prime[j]]=phi[i]*prime[j]; 14 break; 15 }else{ 16 phi[i*prime[j]]=phi[i]*(prime[j]-1); 17 } 18 } 19 } 20 }
线性筛筛莫比乌斯函数:

1 getxxs(int N){ 2 for(int i=2;i<=N;i++){ 3 v[i]=1; 4 } 5 mu[1]=1; 6 for(int i=2;i<=N;i++){ 7 if(v[i]){ 8 prime[++num]=i; 9 mu[i]=-1; 10 } 11 for(int j=1;j<=num&&i*prime[j]<=N;j++){ 12 v[i*prime[j]]=0; 13 if(i%prime[j]==0){ 14 mu[i*prime[j]]=0; 15 break; 16 }else{ 17 mu[i*prime[j]]=-mu[i]; 18 } 19 } 20 } 21 }