扩展欧几里得算法及其应用

news/2024/7/8 0:15:59

前言

由于数论的板子真的很抽象,也很难背,所以特此记录扩展欧几里得算法的板子和它的用途

本篇文章只涉及应用,不涉及证明,如需理解证明还请各位移步其他优秀的讲解!

扩展欧几里得算法 

先粘一下板子的代码

typedef long long LL ; 

LL exgcd(LL a, LL b, LL &x, LL &y) 
{
    if (!b) 
    {
        x = 1, y = 0 ; 
        return a ; 
    }

    LL d = exgcd(b, a % b, y, x) ; 
    y -= a / b * x ; 

    return d ; 
}

变量解释

对于方程:ax + by = d 

其中 a 和 b 都是常数 (已知量),d 是 a 和 b 的最大公约数

x 和 y 是我们希望求得的一组满足方程的解


应用例题 

题目链接🔗:222. 青蛙的约会 - AcWing题库 

题目分析 

AC代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std ;

typedef long long LL ; 

LL exgcd(LL a, LL b, LL &x, LL &y) 
{
    if (!b) 
    {
        x = 1, y = 0 ; 
        return a ; 
    }

    LL d = exgcd(b, a % b, y, x) ; 
    y -= a / b * x ; 

    return d ; 
}

int main() 
{
    ios::sync_with_stdio(false) ; 
    
    LL a, b, m, n, L ; 
    cin >> a >> b >> m >> n >> L ;

    LL x, y ; 
    LL d = exgcd(m - n, L, x, y) ; 

    if ((b - a) % d) cout << "Impossible" << endl ;
    else 
    {
        x *= (b - a) / d ; 
        LL t = abs(L / d) ; 
        cout << (x % t + t) % t << endl ; // 求最小正整数解
    }

    return 0 ; 
}

难点解释

为什么要计算 t ?

解释:

题解来源🔗: AcWing 222. 青蛙的约会 - AcWing


再来一道题目巩固一下

同余方程模版题 🔗203. 同余方程 - AcWing题库

题目描述

题目分析 

a * x % b = 1 等价于找到两个数 x 和 y 使得 a * x + b * y = 1

这恰好是我们扩展欧几里得算法的基本解决对象,直接套板子就行了,由于题目保证输入一定有解,所以我们可以认为 a 和 b 是互质的,因此可以使用扩展欧几里得算法。

最后记得对b取模保证答案为最小正数。

AC代码 

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std ;

typedef long long LL ; 

int exgcd(int a, int b, int &x, int &y) 
{
    if (!b) 
    {
        x = 1, y = 0 ; 
        return a ; 
    }
    
    int d = exgcd(b, a % b, y, x) ; 
    y -= a / b * x ; 
    
    return d ; 
}

int main() 
{
    ios::sync_with_stdio(false) ; 
    int a, b ; 
    cin >> a >> b ; 
    
    int x, y ; 
    exgcd(a, b, x, y) ; 
    
    cout << (x % b + (LL)b) % b << endl ; 

    return 0 ; 
}

END


http://lihuaxi.xjx100.cn/news/980170.html

相关文章

每天5分钟快速玩转机器学习:贝叶斯算法的局限性

本文重点 贝叶斯算法的应用很广泛,其中最经典的应用就是垃圾邮件的分类,本节课程通过垃圾邮件的例子来看一下贝叶斯算法存在的一些问题,我们应该如何解决它? 垃圾邮件分类 给定一封电子邮件,我们如何判断这封电子邮件是垃圾邮件还是正常邮件,这是机器学习中的二分类问…

Android13 音量曲线调整

Android13 音量曲线调整 Android13 上配置文件的路径&#xff1a; /vendor/sprd/modules/audio/engineconfigurable_apm/工程目录/system/etc/audio_engine_config/audio_policy_engine_stream_volumes.xml /vendor/sprd/modules/audio/engineconfigurable_apm/工程目录/sys…

Oracle 数据库相关信息清单列表

Oracle 数据库相关信息清单列表 一、设置Oracle安装目录 Oracle基目录(ORACLE_BASE):D:\databases\oracle\oracle_11g\app\Administrator 软件位置(ORACLE_HOME):D:\databases\oracle\oracle_11g\app\Administrator\product\11.2.0\dbhome_1 数据库文件位置:D:\databa…

lc23. 合并K个升序链表

题目描述给你一个链表数组&#xff0c;每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。示例 1&#xff1a;输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]]输出&#xff1a;[1,1,2,3,4,4,5,6]解释&#xff1a;链表数组如下&…

制作一个简单的信用卡验证表

下载:https://download.csdn.net/download/mo3408/87559584 效果图: 您可以从文章顶部附近的下载按钮获取该项目的完整代码。这些文件的概述如下所示: 我们需要将两个 .css 文件和两个 .js 文件包含在我们的 HTML 中。所有其他资源,例如 Bootstrap 框架、jQuery 和 Web 字…

了解国外SEO负面压制的现状与应对策略!

随着全球化的发展&#xff0c;越来越多的企业和品牌开始将目光转向海外市场&#xff0c;而谷歌作为全球最大的搜索引擎之一&#xff0c;也成为了外贸企业最主要的搜索引擎之一。 然而&#xff0c;随着谷歌的不断发展&#xff0c;国外SEO负面压制的现状也愈发严峻&#xff0c;外…

Spring——AOP核心概念和AOP入门案例

AOP:面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 作用:在不惊动原始设计的基础上进行功能增强 Spring理念:无侵入式编程 比如测试一个方法的万次执行时间&#xff0c;原本没有Aop需要这样写 public void save() {Long stSystem.currentTim…

【Python语言基础】——Python MongoDB

Python语言基础——Python MongoDB 文章目录Python语言基础——Python MongoDB一、Python MongoDB一、Python MongoDB Python 可以在数据库应用程序中使用。 最受欢迎的 NoSQL 数据库之一是 MongoDB。 MongoDB MongoDB 将数据存储在类似 JSON 的文档中&#xff0c;这使得数据库…