欧拉函数 模板题 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;} 
 



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值