欧拉函数
欧拉函数
欧拉函数 \(\varphi(a)\) 为小于等于 \(a\) 的正整数中与 \(a\) 互质的个数。
显然得到 \(\varphi(1) = 1\) ,当 \(a\) 为质数的时候我们有 \(\varphi(a) = a-1\)
同时,我们有\(\varphi(n) = n\times(\frac{p-1}{p}) = p^{k-1}\times(p-1)\) ,其中 \(n = p^k\) 并且 \(p\) 为质数。
同时我们知道欧拉函数是一个积性函数,也就是当 \(\gcd(a,b) = 1\) 时有
\[\varphi(a\times b) = \varphi(a) \times \varphi(b)
\]
我们可以将 \(n\) 唯一质因数分解, \(n = \prod_{i=1}^sp_i^{k_i}\) ,其中 \(p_i\) 表示第 \(i\) 个质因数, \(k_i\) 表示对应的质因数的因数个数 。
显然我们得到了
\[\varphi(n) = n\times\prod_{i=1}^s\frac{p_i-1}{p_i}
\]
如果我们找到 \(n\) 的最小质因数 \(p\) , 如果 \(\gcd(p,\frac{n}{p}) = 1\) ,那么就有 \(\varphi(n) = \varphi(\frac{n}{p})\times\frac{p-1}{p}\)
如果 \(\gcd(p,\frac{n}{p}) = p\) 那么就有 \(\varphi(n) = \varphi(\frac{n}{p})\times 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;
}
}
}
}