筛法求欧拉函数(线性)

来源:互联网 发布:施工动画制作软件 编辑:程序博客网 时间:2024/05/17 03:52
#include<cstdio>#include<algorithm>#include<vector>#define maxn 10000005using namespace std;long long n,phi[maxn];int siz;bool vis[maxn];vector<int>prime;int main(){scanf("%lld",&n);phi[1]=1;for(int i=2;i<=n;i++){if(!vis[i]) prime.push_back(i),siz++,phi[i]=i-1;for(int j=0;j<siz && i*prime[j]<=n;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){phi[i*prime[j]] = prime[j] * phi[i];break;}elsephi[i*prime[j]] = prime[j] * phi[i] - phi[i];}}bool flag=0;for(int i=1;i<=n;i++)printf("%d ",phi[i]);}