数学知识(二)——欧拉函数、 快速幂、 扩展欧几里得算法、中国剩余定理

前言

算法基础课第四章 数学知识(二)

共7题,知识点如下

欧拉函数
AcWing 873. 欧拉函数
AcWing 874. 筛法求欧拉函数

快速幂
AcWing 875. 快速幂
AcWing 876. 快速幂求逆元

扩展欧几里得算法
AcWing 877. 扩展欧几里得算法
AcWing 878. 线性同余方程

中国剩余定理
AcWing 204. 表达整数的奇怪方式

欧拉函数

在这里插入图片描述
时间复杂度O(根号n)
瓶颈在分解质因数上
在这里插入图片描述

加上4个相乘的
减去5个相乘的
···

在这里插入图片描述
用容斥原理算出来的,两个式子等价,
比如,先把N提出来, (1 / p1) 的系数是-1,(1 / p1p2) 的系数是正1

模板——求欧拉函数

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;
}

AcWing 873. 欧拉函数

该题时间复杂度是n*根号ai

用定义直接求每个数的欧拉函数

#include <iostream>
#include <algorithm>

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是a的一个质因子
                // res = res / 1 * (1 / a); 不能有小数, 下面式子与这个等价 
                res = res / i * (i - 1);
                while  (a % i == 0) a /= i;  // 把i除干净
            }
        }
        // 满足说明a有一个大的质因子,将其也除去
        if (a > 1) res = res / a * (a - 1);
        
        cout << res << endl;
    }
    return 0;
}

欧拉函数的用法其实就是后面有个欧拉定理

待会会讲欧拉函数的证明

定义成函数,分开写

#include <iostream>

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;
        cout << phi(x) << endl;
    }

    return 0;
}

欧拉函数记住公式,知道推导是容斥原理即可
在这里插入图片描述

模板——筛法求欧拉函数

int primes[N], cnt;     // primes[]存储所有素数
int euler[N
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值