[AcWing 873] 欧拉函数

image

复杂度 O(n)

总体复杂度 100×2×1094.5×106


点击查看代码
#include<iostream>

using namespace std;

void solve(int 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;
}
int main()
{
    int n;
    cin >> n;
    while (n --) {
        int x;
        cin >> x;
        solve(x);
    }
    return 0;
}

  1. 欧拉函数的定义
    1 ~ N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)
    若在算数基本定理中,N=p1α1p2α2pmαm ,则
    ϕ(N)=N×p11p1×p21p2××pm1pm
  2. 欧拉函数公式的证明
    ϕ(N)=N×p11p1×p21p2××pm1pm=N×(11p1)×(11p2)××(11pm)
    1 ~ N 中与 N 互质的数的个数等于 N 减去 p1, p2,, pm 倍数的个数,剩下的数就都是和 N 互质的数,由容斥原理,可以得到:
    ϕ(N)=NNp1Np2+Np1p2+Np1p3+Np1p2p3Np1p2p4+Np1p2p3p4+
    ϕ(N)=N×(11p1)×(11p2)××(11pm) 展开,可以得到上式结果,说明两式子等价,证明完毕;
  3. 在用公式计算时,要先进行除法,再进行乘法,也就是 res = res / i * ( i - 1 ),如果先进行乘法,会爆 int;(先除后乘肯定不会溢出)
posted @   wKingYu  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
欢迎阅读『[AcWing 873] 欧拉函数』
点击右上角即可分享
微信分享提示