欧拉函数是:对于一个正整数n,小于n且和n互质的正整数的个数,记作φ(n) 。
公式::φ(x)=x * (1-1/p1) * (1-1/p2) * (1-1/p3) * (1-1/p4)…..(1-1/pn)其中p1, p2……pn为x的所有质因数
利用公式直接求:
int Euler(int n)//直接求解
{
int res = n;
for(int i = 2; i <= n; i++){
if(n % i == 0){
res = res / i * (i - 1);
}
while(n % i == 0){
n = n / i;
}
}
return res;
}
如果要求某个范围内所有数的φ(x),那么上面的方法并不好,这时候我们需要利用它的一个性质
1.设a为N的质因数,
若(N % a == 0 && (N / a) % a == 0) 则有φ(N)=φ(N / a) * a;
若(N % a == 0 && (N / a) % a != 0) 则有:φ(N) = φ(N / a) * (a - 1)
int euler[1000005];
bool isprime[1000005];
int prime[1000005],top;
void Prime(int n) //利用线性筛选打表
{
memset(isprime, true, sizeof(isprime));
euler[1] = 1;
for(int i = 2; i <= n; i++){
if(isprime[i]){
prime[top++] = i;
euler[i] = i - 1;
}
for(int k = 0; k < top && (__int64)i*prime[k] <= n; k++){
isprime[i*prime[k]] = false;
if(i % prime[k] == 0){
euler[i*prime[k]] = euler[i]*prime[k];
break;
}
else{
euler[i*prime[k]] = euler[i]*(prime[k]-1);
}
}
}
}