源代码: #include<cstdio> #include<cmath> #define LL long long using namespace std; LL n,Ans=1,Num(0),Sum[3500]={0},Prime[3500]; bool Flag[32000]={0}; void Euler() //欧拉筛法。 { LL t=sqrt(n)+1; for (LL a=2;a<=t;a++) { if (!Flag[a]) Prime[Num++]=a; for (LL b=0;b<Num&&a*Prime[b]<=t;b++) { Flag[a*Prime[b]]=true; if (!(a%Prime[b])) break; } } } LL Count(LL X,LL S) //快速幂。 { LL T=1; while (S) { if (S&1) T*=X; X*=X; S>>=1; } return T; } int main() { scanf("%lld",&n); Euler(); for (LL a=0;a<Num;a++) { if (!n) break; while (!(n%Prime[a])&&n) //分解质因数。 { Sum[a]++; n/=Prime[a]; } } if (n>1) Ans=n-1; for (LL a=0;a<Num;a++) if (Sum[a]) Ans*=(Prime[a]-1)*Count(Prime[a],Sum[a]-1); printf("%lld",Ans); return 0; } /* 利用欧拉函数的以下性质求解即可: (1)φ(n)=φ(p^k)=p^k-p^(k-1)=(p-1)p^(k-1),p为质数; (2)φ(mn)=φ(m)*φ(n),m和n互质; 数论耳。 */