欧拉函数

定义

欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1

计算通式

φ(x)=x\(\prod_{i=0}^n(1-\frac{1}{p_i})\)

φ(1)=1

其中\(p_1,p_2 \cdots p_n\)为x的所有质因数,x是正整数。

理解:对于x的一个质因数\(p_i\),因为x以内\(p_i\)的倍数是均匀分布的,所以x以内有\(\frac{1}{p_i}\)的数是\(p_i\)的倍数,那么有\(1-\frac{1}{p_i}\)的数不是\(p_i\)的倍数,则有\(\prod_{i=0}^n(1-\frac{1}{p_i})\)的数与x互质。

欧拉函数的性质

  1. 质数p, φ(p)=p-1

  2. 质数p, 若\(n=p^k\),则φ(p)=\(p^k-p^{k-1}\)

代入计算通式易得

  1. 欧拉函数是积性函数,但不是完全积性函数。

由互质,计算通式相乘可以证明。

  1. 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n>1)

与n互质的数一个是m,那么还存在另一个数n-m也与n互质。所以与n互质的数的平均数是n/2,而个数又是φ(n),可以得到这些数的和就是φ(n)*n/2

  1. 当n>2时,φ(n)是偶数
  2. \(n=\sum_{d|n}φ(d)\) , 即n的因数(包括1和它自己)的欧拉函数之和等于n

求欧拉函数

以最坏时间复杂度 \(O(\sqrt{n})\) 内求得指定正整数的欧拉函数值。

int phi(int n)
{
    int res = n;
    for (int i = 2; i * i <= n; i++)
    {
        if (n % i == 0)
            res = res / i * (i - 1); // 先除再乘防止溢出
        while (n % i == 0) // 每个质因数只处理一次,可以把已经找到的质因数除干净
            n /= i;
    }
    if (n > 1)
        res = res / n * (n - 1); // 最后剩下的部分也是原来的n的质因数
    return res;
}

在欧拉筛途中顺便求出

int cnt = 0;
bool vis[50004];
int prim[50004];
int phi[50004];
void sieve(int n)
{
    vis[1] = 1;phi[1] = 1;
    for(int i=2;i<=n;++i)
    {
        if(vis[i]==0){
            prim[++cnt] = i;
            phi[i] = i - 1;
        } 
        for(int j=1;j<=cnt&&i*prim[j]<=n;++j)
        {
            vis[i*prim[j]] = 1;
            if(i%prim[j]==0){
                phi[i*prim[j]] = phi[i] * prim[j];
                break;
            }
            else phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
}

题目

NC20313 SDOI2008仪仗队

积性函数

当m与n互质时,$f ( m \times n ) = f ( m ) \times f ( n ) \(,那么f是积性函数。若对任意正整数,都有\)f(m\times n)=f(m)\times f(n)$成立,则f是完全积性函数。

posted @ 2022-07-09 17:40  HIVM  阅读(207)  评论(0编辑  收藏  举报