欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)
通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn)
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(和1互质的数(小于等于1)就是1本身)。
注意:每种质因数只一个。 比如12=2*2*3那么φ(12)=φ(4*3)=φ(2^2*3^1)=(2^2-2^1)*(3^1-3^0)=4
求法:
1、暴力 O(n^2)
long long int oula(long long int n)
{
int i;
long long int temp = n;
for(i = 2; i <= sqrt(n); i++)
{
if(n %i ==0)
{
temp = temp / i * (i-1);
while(n%i==0)
{
n /= i;
}
}
}
if(n>1)
temp = temp / n * (n-1);
return temp;
}
2、筛选法打欧拉函数表
#define Max 1000001
int euler[Max];
void oula()
{
euler[1]=1;
for(int i=2;i<Max;i++)
euler[i]=i;
for(int i=2;i<Max;i++)
if(euler[i]==i) {
for(int j=i;j<Max;j+=i)
euler[j]=euler[j]/i*(i-1);
}
}