欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.
对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数(包含1).
下面两种方法求欧拉函数值,一种直接算出来的,另一种是通过筛选得来的。
#define N 5000000+10
typedef unsigned long long ll;
ll Euler[N];
ll init(int n)//根据定义直接算
{
ll sum=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
sum=sum/i*(i-1);//先乘再除防止中间过程数据溢出
while(n%i==0)
n/=i;
}
}
if(n>1)
sum=sum/n*(n-1);
return sum;
}
void init()//筛选得来
{
Euler[1]=1;
for(int i=2; i<N; i++)
Euler[i]=i;
for(int i=2; i<N; i++)
if(Euler[i]==i)
for(int j=i; j<N; j+=i)
Euler[j]=Euler[j]/i*(i-1);
}