AcWing 873. 欧拉函数
. 欧拉函数
一、题目描述
给定 个正整数 ,请你求出每个数的欧拉函数。
欧拉函数的定义
输入格式
第一行包含整数 。
接下来 行,每行包含一个正整数 。
输出格式
输出共 行,每行输出一个正整数 的欧拉函数。
数据范围
输入样例:
3
3
6
8
输出样例:
2
2
4
二、欧拉函数定义
定义:欧拉函数是小于的数中与互质的数的数目。
例如,因为均和互质。
三、欧拉函数公式
如果的唯一分解式:
有:
对比与复习,复习办法(用纸笔抄公式记忆+打代码记忆):
-
约数个数:只与 幂次 相关,与质因子无关
约数个数 -
约数和:与质数因子和幂次都相关
以举例,求它的全部约数和:
约数和=
欧拉函数公式,只与因子相关,与指数无关!
还是上面的栗子:
四、欧拉函数公式证明
欧拉函数的证明是使用的融斥原理,从定义出发:
定义:欧拉函数是小于的数中与互质的数的数目。

(1)对数字进行质因数分解:
(2) 如果一个数包含了这个因子,那么它肯定与不互质,因为有这个公因子嘛,换句话说,就是要想与互质,那么一定不能包含这此因子。
小于的所有数字中,如果它包含了这样的因子的话,那么它就与不互质,换句话说,只要把小于之内,所有包含的数字都干掉,剩下的就是与互质的数。所谓包含其实也就是
的整数倍。
- 把的倍数从中减去,那需要减去多少个呢?
个.
这里想不明白的话,可以举个栗子:比如,,有几个的倍数呢?个!为什么呢?
(3) 把的倍数都减去吧,分别减去,,...,个。
(4) 这么干是减多了的,比如某个数,是的倍数,也是的倍数,就减了两回,还需要再加回来的倍数,就是 + + + + ....
(5)将公式展开,发现就是上面的东东了,证毕。
(6)
下面在编码计算单个数字的欧拉函数值时,要用到这个变形。
五、求单个数字的欧拉函数
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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#控制其它程序