欧拉函数

欧拉函数

欧拉函数 (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;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/nao-nao/p/13647143.html