求欧拉函数

原题链接:AcWing 873. 欧拉函数

题目:给定n 个正整数a_{i},请你求出每个数的欧拉函数。

欧拉函数1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。公式如下:
ϕ(N) = N(1-1/p_{1})(1-1/p_{2})...(1-1/p_n)
其中p_1, p_2, ..., p_nN的质因子。
互质:两个数的最大公因数是1,即gcd(a, b) = 1

证明:

假设p,q,kN的质因子,则在1∼Np的倍数有p, 2p,3p,...,(N/p)p,一共N/p个。同理qk的倍数有N/q,N/k个。如果把这N/p,N/q,N/k个数去掉,则N/pq,N/pk, N/qk被多去了一次,需要加回来,但加回来后此时N/pqk被少去了一次,所以需要再去掉一次,故有在1∼Np,q,k的倍数有:
\begin{aligned} S(N|p,q,k)&= N-(N/p+N/q+N/k) + (N/pq+N/pk+N/qk) - N/pqk\\ &= N(1-1/p)(1-/q)(1-1/k) \end{aligned}
故若N = p_{1}^{k_{1}}p_{2}^{k_{2}}...p_{n}^{k_{n}}p_{1},p_{2},...,p_{n}N的质因子,则1∼Np_{1},p_{2},...,p_{n}的倍数有:
\begin{aligned} S(N|p_{1}, p_{2},...,p_{n})= N(1-1/p_{1})(1-/p_{2})...(1-1/p_{n}) \end{aligned}
而在1∼N 中与 N 不互质的只有其质因子的倍数,所以与N互质的数的个数即为1∼N中非其质因子倍数的个数,从而有:
ϕ(N) = N(1-1/p_{1})(1-1/p_{2})...(1-1/p_n)

算法实现:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;
    while (n -- )
    {
        int x;
        cin >> x;
        int res = x;
        for(int i=2;i<=x/i;i++)
        {
            if(x % i == 0)
            {
                res = res / i * (i - 1);
                while(x % i == 0) x /= i;
            }
        }
        if(x > 1) res = res / x  * (x - 1); // 先除再乘,可以防止溢出
        
        cout << res << endl;
    }
    
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容