AcWing 873. 欧拉函数

AcWing 873. 欧拉函数

一、题目描述

给定 n 个正整数 ai,请你求出每个数的欧拉函数。

欧拉函数的定义

输入格式
第一行包含整数 n

接下来 n 行,每行包含一个正整数 ai

输出格式
输出共 n 行,每行输出一个正整数 ai 的欧拉函数。

数据范围
1n100,1ai2×109

输入样例:

3
3
6
8

输出样例:

2
2
4

二、欧拉函数定义

定义:欧拉函数是小于n的数中与n互质的数的数目。

例如φ(8)=4,因为1,3,5,7均和8互质。

三、欧拉函数公式

如果n的唯一分解式:n=p1r1p2r2...pkrk
有:

φ(n)=n×(11p1)×(11p2)×...×(11pk)

对比与复习,复习办法(用纸笔抄公式记忆+打代码记忆):

  • 约数个数:只与 幂次 相关,与质因子无关
    180=22325
    约数个数=(1+2)(1+2)(1+1)=18

  • 约数和:与质数因子和幂次都相关
    360举例,求它的全部约数和:
    360=222335=233251
    约数和=(20+21+22+23)(30+31+32)(50+51)=(1+2+4+8)(1+3+9)(1+5)=15136=1170

欧拉函数公式,只与因子相关,与指数无关!
还是上面的栗子:

8=23φ(8)=8(112)=4

四、欧拉函数公式证明

欧拉函数的证明是使用的融斥原理,从定义出发:
定义:欧拉函数是小于n的数中与n互质的数的数目。

(1)对数字N进行质因数分解:

N=p1r1p2r2p3r3...pkrk

(2) 如果一个数包含了p1这个因子,那么它肯定与N不互质,因为有p1这个公因子嘛,换句话说,就是要想与N互质,那么一定不能包含p1,p2,...,pk这此因子。

小于N的所有数字中,如果它包含了p1,p2,...,pk这样的因子的话,那么它就与N不互质,换句话说,只要把小于N之内,所有包含p1,p2,..pk的数字都干掉,剩下的就是与N互质的数。所谓包含p1,p2,..,pk其实也就是
p1,p2,..,pk的整数倍。

  • p1的倍数从N中减去,那需要减去多少个呢?

Np1个.

这里想不明白的话,可以举个栗子:比如N=10p1=2,有几个p1的倍数呢?5个!为什么呢?

102=5

(3) 把p2,p3,...,pk的倍数都减去吧,分别减去Np2,Np3,...,Npk个。

(4) 这么干是减多了的,比如某个数,是p2的倍数,也是p3的倍数,就减了两回,还需要再加回来pipj的倍数,就是 + Np1p2+ Np1p3+ Np1pk+ ....

(5)将公式ϕ(N)=N(11p1)(11p2)(11p3)...(11pk)展开,发现就是上面的东东了,证毕

(6)

ϕ(N)=N(11p1)(11p2)(11p3)...(11pk)  ϕ(N)=N(p11p1)(p21p2)(p31p3)...(pk1pk)

下面在编码计算单个数字的欧拉函数值时,要用到这个变形。

五、求单个数字的欧拉函数

#include <bits/stdc++.h>

using namespace std;

int phi(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);
    return res;
}

int main() {
    int n;
    cin >> n;
    while (n--) {
        int x;
        cin >> x;
        printf("%d\n", phi(x));
    }
    return 0;
}
posted @   糖豆爸爸  阅读(402)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2016-09-27 C#控制其它程序
Live2D
点击右上角即可分享
微信分享提示