欧拉函数实现与分析

问题

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) φ(mn)=φ(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α1p2α2pkα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 2p1 3 ∗ p 1 3*p_1 3p1 ⋯ \cdots p 1 α 1 − 1 ∗ p 1 p_1^{\alpha_1-1}*p_1 p1α11p1 p 1 α 1 − 1 p_1^{\alpha_{1-1}} p1α11

可以得到 φ ( 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α1p1α11=p1α1(1p11)

最终可以得到
φ ( 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α1p2α2pkαk(1p11)(1p21)(1pk1)
最终化简可得
φ ( n ) = n ∗ ∏ i = 1 k ( 1 − 1 p i ) \varphi(n)=n*\prod_{i=1}^{k}(1-\frac{1}{p_i}) φ(n)=ni=1k(1pi1)

代码

#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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值