1.1欧拉函数定义
首先,需要理解一下什么是欧拉函数,欧拉函数phi(n)的定义为小于等于n且与n互素的整数个数。那么什么是互素呢?互素是指对于两个数a和b,a和b的最大公约数为1(即gcd(a, b) = 1);
1.21模板-求解数x的欧拉函数(时间复杂度O(sqrt(x)))
int Phi(int x){
int rea = x;
for(int i = 2; i*i <= x; i++){
if(x%i == 0){
rea = rea - rea/i;
while(x%i == 0){
x /= i;
}
}
}
if(x > 1)
rea = rea - rea/x;
return rea;
}
1.22模板-求解[1, maxn]区间内所有数的欧拉函数值(时间复杂度O(n*ln(n)))
int phi[1001400];/*数i的欧拉函数值*/
int tp, link[1001400];/*数i是素数 <=> 数i的欧拉函数值等于i-1*/
void Phi(int maxn);/*求解[1, n]区间内所有数的欧拉函数值*/
void Phi(int maxn){
tp = 0;
for(int i = 1; i <= maxn; i++)
phi[i] = i;
for(int i = 2; i <= maxn; i += 2)
phi[i] /= 2;
link[tp++] = 2;
for(int i = 3; i <= maxn; i += 2){
if(phi[i] == i){
for(int j = i; j <= maxn; j += i)
phi[j] = phi[j]/i * (i-1);
}
if(phi[i] == i-1)
link[tp++] = i;
}
}