欧拉函数可以直接打表,时间复杂度为O(nlognlogn);
<pre name="code" class="cpp">//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/2.
// Copyright © 2016年 邵金杰. All rights reserved.
//
int euler(int n)
{
int ret=1;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
n/=i;ret*=i-1;
while(n%i==0) {n/=i;ret*=i;}
}
}
if(n>1) ret*=n-1;
return ret;
}
int euler_phi(int n)
{
int ans=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
void phi_table(int n,int phi[])
{
for(int i=1;i<=n;i++) phi[i]=0;
for(int i=2;i<=n;i++)
{
if(!phi[i])
{
for(int j=i;j<=n;j+=i)
{
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
}
}