线性筛模板

来源:互联网 发布:数据挖掘和数据分析 编辑:程序博客网 时间:2024/05/29 16:41

 

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int N=1000005;int n,m;int p[N],phi[N],u[N],f[N];//f£ºÔ¼Êý¸öÊý bool b[N];void clear(){m=0;memset(b,false,sizeof(b));}void get_p(){clear();for (int i=2;i<=n;i++){if (!b[i]) p[++m]=i;for (int j=1;j<=m&&p[j]*i<=n;j++) {b[i*p[j]]=true;if (i%p[j]==0) break;}}}void get_phi(){clear();phi[1]=1;for (int i=2;i<=n;i++){if (!b[i]){p[++m]=i;phi[i]=i-1;}for (int j=1;j<=m&&p[j]*i<=n;j++){b[i*p[j]]=true;if (i%p[j]) phi[i*p[j]]=phi[i]*phi[p[j]];else {phi[i*p[j]]=phi[i]*p[j];break;}}}}void get_u(){clear();u[1]=1;for (int i=2;i<=n;i++){if (!b[i]){p[++m]=i;u[i]=-1;}for (int j=1;j<=m&&p[j]*i<=n;j++){b[i*p[j]]=true;if (i%p[j]) u[i*p[j]]=-u[i];else {u[i*p[j]]=0;break;}}}}void get_f(){clear();f[1]=1;for (int i=2;i<=n;i++){if (!b[i]){f[i]=2;p[++m]=i;}for (int j=1;j<=m&&p[j]*i<=n;j++){b[i*p[j]]=true;if (i%p[j]) f[i*p[j]]=f[i]*f[p[j]];else {int tmp=i,cnt=2;while (tmp%p[j]==0) tmp=tmp/p[j],cnt++;f[i*p[j]]=f[tmp]*cnt;}}}}int main(){scanf("%d",&n);get_p();for (int i=1;i<=m;i++) printf("%d ",p[i]);printf("\n");get_phi();for (int i=1;i<=n;i++) printf("%d ",phi[i]);printf("\n");get_u();for (int i=1;i<=n;i++) printf("%d ",u[i]);printf("\n");get_f();for (int i=1;i<=n;i++) printf("%d ",f[i]);printf("\n");return 0;}


 

0 0