Euler function definition:
How to find a single Euler function:
int euler(int x)
{
int res=x;
for(int i=2;i<=x/i;i++)
{
if(x%i==0)
{
res=res/i*(i-1);
while(x%i==0) x/=i;
}
}
if(x>1) res=res/x*(x-1);
return res;
}
int main()
{
int n; cin>>n;
cout<<euler(n)<<endl;
return 0;
}
Interval Euler function sieve method:
(Find the Euler function value of 1~n)
1. The idea of Ehrlich sieve:
const int maxn=1e6+5;
int phi[maxn]; //phi[i]是i的欧拉函数值
void Euler(int n)
{
//首先将每个数的欧拉函数值都初始化为它自己
for(int i=1;i<=n;i++) phi[i]=i;
for(int i=2;i<=n;i++)
{
//对于每一个质数p,对2p,3p,...的欧拉函数值/p*(p-1)
if(phi[i]==i)
{
for(int j=i;j<=n;j+=i)
phi[j]=phi[j]/i*(i-1);
}
}
}
int main()
{
int n; cin>>n;
Euler(n);
return 0;
}
2. Find Euler function in the linear sieve process:
const int N = 1e6+5;
int prime[N],cnt,phi[N];
bool vis[N];
void get_euler(int n)
{
phi[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;prime[j]<=n/i;j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0)
{
phi[prime[j]*i]=phi[i]*prime[j];
break;
}
phi[prime[j]*i]=phi[i]*(prime[j]-1);
}
}
}
int main()
{
int n; cin>>n;
get_euler(n);
return 0;
}