问题
https://www.acwing.com/problem/content/875/
分析
对于一个正整数 n n n 欧拉函数指小于或等于 n n n 的正整数中与 n n n 互质的数的数目,记作 φ ( n ) \varphi(n) φ(n) ,其中有 φ ( 1 ) = 1 \varphi(1) = 1 φ(1)=1
欧拉函数本身是一个积性函数, φ ( m ∗ n ) = φ ( m ) ∗ φ ( n ) \varphi(m*n)=\varphi(m)*\varphi(n) φ(m∗n)=φ(m)∗φ(n)
已知对于每一个正整数 n n n 而言都有 n = p 1 α 1 ∗ p 2 α 2 ∗ ⋯ ∗ p k α k n=p_1^{\alpha_1}*p_2^{\alpha_2}*\cdots*p_k^{\alpha_k} n=p1α1∗p2α2∗⋯∗pkαk
则可以得到 φ ( n ) = φ ( p 1 α 1 ) ∗ φ ( p 2 α 2 ) ∗ ⋯ ∗ φ ( p k α k ) \varphi(n)=\varphi(p_1^{\alpha_1})*\varphi(p_2^{\alpha_2})*\cdots*\varphi(p_k^{\alpha_k}) φ(n)=φ(p1α1)∗φ(p2α2)∗⋯∗φ(pkαk)
对于 φ ( p 1 α 1 ) \varphi(p_1^{\alpha_1}) φ(p1α1) 与 p 1 α 1 p_1^{\alpha_1} p1α1 不互质的数有 p 1 p_1 p1、 2 ∗ p 1 2*p_1 2∗p1、 3 ∗ p 1 3*p_1 3∗p1、 ⋯ \cdots ⋯ 、 p 1 α 1 − 1 ∗ p 1 p_1^{\alpha_1-1}*p_1 p1α1−1∗p1 共 p 1 α 1 − 1 p_1^{\alpha_{1-1}} p1α1−1 个
可以得到 φ ( p 1 α 1 ) = p 1 α 1 − p 1 α 1 − 1 = p 1 α 1 ( 1 − 1 p 1 ) \varphi(p_1^{\alpha_1})=p_1^{\alpha_1}-p_1^{\alpha_1-1}=p_1^{\alpha_1}(1-\frac{1}{p_1}) φ(p1α1)=p1α1−p1α1−1=p1α1(1−p11)
最终可以得到
φ
(
n
)
=
p
1
α
1
∗
p
2
α
2
∗
⋯
∗
p
k
α
k
∗
(
1
−
1
p
1
)
∗
(
1
−
1
p
2
)
∗
⋯
∗
(
1
−
1
p
k
)
\varphi(n)=p_1^{\alpha_1}*p_2^{\alpha_2}*\cdots*p_k^{\alpha_k}*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*\cdots*(1-\frac{1}{p_k})
φ(n)=p1α1∗p2α2∗⋯∗pkαk∗(1−p11)∗(1−p21)∗⋯∗(1−pk1)
最终化简可得
φ
(
n
)
=
n
∗
∏
i
=
1
k
(
1
−
1
p
i
)
\varphi(n)=n*\prod_{i=1}^{k}(1-\frac{1}{p_i})
φ(n)=n∗i=1∏k(1−pi1)
代码
#include<iostream>
using namespace std ;
int main()
{
int n ;
cin >> n ;
while(n --)
{
int a ;
cin >> a ;
int res = a ;
for(int i = 2 ; i <= a / i ; i ++)
{
if(a % i == 0)
{
// 此处需要先除 i 再乘 i - 1 要不然可能无法整除
res = res / i * (i - 1) ;
while(a % i == 0)
a /= i ;
}
if(a > 1)
res = res / a * (a - 1) ;
}
cout << res << endl ;
}
return 0 ;
}