题目描述
给你 $n$ 个整数 $x_1,x_2,x_3, …, x_n$,对于每一个 $x_i$,求出 $\varphi(x_i)$ (即 $x_i$ 的欧拉函数)的值。
样例
输入样例:
3
3
6
8
输出样例:
2
2
4
思路
欧拉函数的定义:$1\sim x$ 当中与 $x$ 互质的数的个数被称为欧拉函数,记作 $\varphi(x)$.
若在算数基本定理中,$x=p_1^{r_1}p_2^{r_2}…p_m^{r_m}$,则有 $\varphi(x)=x\times \dfrac{p_1-1}{p_1}\times \dfrac{p_2-1}{p_2}\times …\times \dfrac{p_m-1}{p_m}=x\times \prod_{质数p|x}\left ( 1-\dfrac{1}{p} \right ) $.
证明:
设 $p$ 是 $x$ 的质因子,则 $1\sim x$ 中 $p$ 的倍数有 $p,2p,3p,…, \dfrac{x}{p} \times p$,共 $\dfrac{x}{p}$ 个。同理,若 $q$ 也是 $x$ 的质因子,则 $1\sim x$ 中 $q$ 的倍数有 $\dfrac{x}{q}$ 个。如果我们去掉这 $\left (\dfrac{x}{p}+\dfrac{x}{q}\right)$ 个数,那么 $pq$ 的倍数就会被除掉两次,需要再加回来一次(容斥原理)。
所以,$1\sim x$ 中不含有质因子 $p,q$ 的数的个数为 $\left(x-\dfrac{x}{p}-\dfrac{x}{q}+\dfrac{x}{pq}\right)$.
同理,通过对 $x$ 的所有质因数进行容斥,即可得到 $\varphi(x)=x\times \dfrac{p_1-1}{p_1}\times \dfrac{p_2-1}{p_2}\times …\times \dfrac{p_m-1}{p_m}=x\times \prod_{质数p|x}\left ( 1-\dfrac{1}{p} \right ) $.
代码
根据刚才我们推出来的公式,并结合判断质因数的代码,我们可以写出计算欧拉函数的代码。
需要注意的是,公式中的 $\varphi(x)=x\times \dfrac{p_1-1}{p_1}\times \dfrac{p_2-1}{p_2}\times …\times \dfrac{p_m-1}{p_m}$ 不能直接套用,否则会导致浮点误差。我们可以定义变量 $e$ 存储结果,并将其初始化为 $x$. 对于 $x$ 的每一个质因数 $p$,$e\leftarrow e\times \left ( 1-\dfrac{1}{p} \right ) =\dfrac{e}{p}\times (p-1)$ . 最后直接输出 $e$ 即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main() {
int n;
scanf("%d", &n);
while (n --) {
int x;
scanf("%d", &x);
int euler = x;
for (int i = 2; i <= x/i; ++i) {
if (x % i == 0) {
euler = euler / i * (i-1);
while (x % i == 0)
x /= i;
}
}
if (x != 1)
euler = euler / x * (x-1);
printf("%d\n", euler);
}
return 0;
}