G09 筛法求欧拉函数
G09 筛法求欧拉函数_哔哩哔哩_bilibili
#include<bits/stdc++.h> using namespace std; const int N=2000010; int n,p[N],vis[N],cnt; int phi[N]; void get_phi(int n){//筛法求欧拉函数 phi[1]=1; for(int i=2; i<=n; i++){ if(!vis[i]){ p[cnt++]=i; phi[i]=i-1; } for(int j=0; i*p[j]<=n; j++){ int m=i*p[j]; vis[m]=1; if(i%p[j]==0){ phi[m]=p[j]*phi[i]; break; } else phi[m]=(p[j]-1)*phi[i]; } } } int main(){ cin>>n; get_phi(n); for(int i=1; i<=n; i++) printf("%d ",phi[i]); }
#include<bits/stdc++.h> using namespace std; int n; int phi(int n){ //试除法求欧拉函数 int res=n; for(int i=2; i*i<=n; i++){ if(n%i==0){ res=res/i*(i-1); while(n%i==0) n/=i; } } if(n>1) res=res/n*(n-1); return res; } int main(){ cin>>n; cout<<phi(n); }
浙公网安备 33010602011771号