欧拉函数 模板题 POJ2407 Relatives

题目大意&&思路:φ(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;} 
 



 

你可能感兴趣的:(欧拉函数 模板题 POJ2407 Relatives)