在数论,对正整数n,欧拉函数是小于n的数中与n互质的数的数目。
性质① m是素数时,有φ(m)=m-1
性质② 当m、n互素时,φ(m*n)=φ(m)*φ(n)性质③ 对一切正整数n,有φ(p^n)=[p^(n-1)]*(p-1)
规定 φ(1)=1
利用性质判定:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; ll eular(ll x) { ll res=x; for(ll i=2;x!=1;i++) if(x%i==0) { res=res/i*(i-1); while(x%i==0) x/=i; } return res; } int main() { ll m; while(~scanf("%I64d",&m)) { printf("%I64d\n",eular(m)); } }
利用性质打表:
#include<iostream> const int N=300; using namespace std; int ph[N],w[N],p[N],pt; int make() { int i,j,k; w[1]=1; for(i=2;i<N;i++) { if(!ph[i]) p[pt++]=ph[i]=i,w[i]=i-1; for(j=0;j<pt&&(k=p[j]*i)<N;j++) { ph[k]=p[j]; if(ph[i]==p[j]) {w[k]=w[i]*p[j];break;} else w[k]=w[i]*(p[j]-1); } } } int main() { int n; make(); while(cin>>n,n) { cout<<w[n]<<endl; } }