欧拉函数
欧拉函数 (varphi(a)) 为小于等于 (a) 的正整数中与 (a) 互质的个数。
显然得到 (varphi(1) = 1) ,当 (a) 为质数的时候我们有 (varphi(a) = a-1)
同时,我们有(varphi(n) = n imes(frac{p-1}{p}) = p^{k-1} imes(p-1)) ,其中 (n = p^k) 并且 (p) 为质数。
同时我们知道欧拉函数是一个积性函数,也就是当 (gcd(a,b) = 1) 时有
[varphi(a imes b) = varphi(a) imes varphi(b)
]
我们可以将 (n) 唯一质因数分解, (n = prod_{i=1}^sp_i^{k_i}) ,其中 (p_i) 表示第 (i) 个质因数, (k_i) 表示对应的质因数的因数个数 。
显然我们得到了
[varphi(n) = n imesprod_{i=1}^sfrac{p_i-1}{p_i}
]
如果我们找到 (n) 的最小质因数 (p) , 如果 (gcd(p,frac{n}{p}) = 1) ,那么就有 (varphi(n) = varphi(frac{n}{p}) imesfrac{p-1}{p})
如果 (gcd(p,frac{n}{p}) = p) 那么就有 (varphi(n) = varphi(frac{n}{p}) imes p)
我们可以使用欧拉筛来线性求出欧拉函数
void init()
{
phi[1] = 1;
for(int i = 2;i <= 100000;i ++){
if(!vis[i]) pri[++cnt] = i,phi[i] = i-1;
for(int j = 1;j <= cnt&&(i*pri[j]<=100000);j ++){
vis[i*pri[j]] = 1;
phi[i*pri[j]] = phi[i]*(pri[j]-1);
if(i%pri[j]==0){
phi[i*pri[j]] = phi[i]*pri[j];
break;
}
}
}
}