题目大意&&思路:φ(n)是积性函数,所以n=P1^k1*……*Pn^kN(素数因子分解)
所以:φ(n)=φ(P1^k1)*……*φ(Pn^kN)
而对于φ(P1^k1),原式等于:P1^k-P1^(k-1),即是(P1-1)*P1^(k-1);在此题目中,因子的次数不会大于31,所以直接POW函数就可以解决问题
AC program: #include<stdio.h> #include<iostream> #include<math.h> #include<string.h> #include<algorithm> using namespace std; typedef __int64 LL; int pp[100005]; int nn[100005]; int main() { LL n; while(cin>>n,n) { LL k=0; LL tmp=n; for(LL i=2;i*i<=tmp;) { if(n%i==0) { LL cnt=0; pp[k]=i; while(n%i==0) { n/=i; cnt++; } nn[k++]=cnt; } else i++; } if(n!=1) { pp[k]=n; nn[k++]=1;} LL sum=1; for(LL i=0;i<k;i++) { sum*=(pp[i]-1)*(int)( pow(pp[i]*1.0,(nn[i]-1)*1.0 ) ); } cout<<sum<<endl; } return 0;}