exgcd

扩展欧几里得算法(Extended Euclidean algorithm, EXGCD),常用于求 \(ax+by=\gcd(a,b)\) 的一组可行解。

部分选自OI Wiki

扩展欧几里得算法

欧几里得算法 的扩展。

扩展欧几里得算法证明

很简单,我们一步一步来(我们定义 \(a\geq b\)):

根据 欧几里得算法 得到 \(\gcd(a,b)=\gcd(b,a\mod b)\) ,所以 \(a \times x_1 + b \times y_1 = b \times x_2 + (a \mod b) \times y_2\) 。

因为 \(a \mod b = a-\lfloor\frac{a}{b}\rfloor \times b\) (这一点很容易理解)

所以 \(a \times x_1 + b \times y_1 = b \times x_2 + (a-\lfloor\frac{a}{b}\rfloor \times b) \times y_2\) 。

把 \(b \times x_2 + (a-\lfloor\frac{a}{b}\rfloor \times b) \times y_2\) 化简得 \(b \times x_2 + a \times y_2-\lfloor\frac{a}{b}\rfloor \times b \times y_2\) 。

再整理一下得 \(a \times y_2 + b \times (x_2 -\lfloor\frac{a}{b}\rfloor \times y_2)\)

和 \(a \times x_1 + b \times y_1\) 一一对应得到:

\[\begin{cases}
a \times x_1 + b \times y_1 \\
a \times y_2 + b \times (x_2 -\lfloor\frac{a}{b}\rfloor \times y_2)
\end{cases}
\]

\[\begin{cases}
x_1 = y_1 \\
y_1 = x_2 -\lfloor\frac{a}{b}\rfloor \times y_2
\end{cases}
\]

欸,这样不就可以通过递归算出了吗?(可以自己手算一下)

扩展欧几里得算法边界

我们的 扩展欧几里得算法 总需要一个边界,所以我们规定了当 \(b=0\) 时(在 欧几里得算法 中我们也是以b=0为边界,具体可看那篇文章),我们的 \(a \times 1 + b \times 0 = a = \gcd(a,b)\) ,所以当 b=0 时

\[\begin{cases}
x = 1 \\
y = 0
\end{cases}
\]

扩展欧几里得算法代码

template<typename T>
void exgcd(T a,T b,T &x,T &y){
if(b==0){
x=1,y=0;
return;
}
exgcd(b,a%b,y,x); // 注意x,y的顺序
// 计算x,y
y-=a/b*x;
}

例题

青蛙的约会


求逆元

(upd:20230816)

老是会忘,记一下

逆元的定义:

\[ab=1(\mod P)
\]
\[\Downarrow
\]
\[ab=1+y\cdot P
\]
\[\Downarrow
\]
\[ab-yP=1
\]

我们是不是可以用exgcd求 b 了

exgcd|扩展欧几里得算法|扩展欧几里得算法证明|exgcd求逆元 一文说明白的更多相关文章

  1. noip知识点总结之--欧几里得算法和扩展欧几里得算法

    一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a  ...

  2. Web 站点的水平扩展和垂直扩展 (译文)

    当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展.选 用哪种策略主要依赖于要解决的问题以及系统资源的限制.在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点.如果你已经有一 ...

  3. hdu_1576A/B(扩展欧几里得求逆元)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others)    Me ...

  4. gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)

    gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗 ...

  5. es6之函数扩展与对象扩展

    一.函数扩展 1.参数默认值 参数有默认值,后面不可以再加没有默认值的变量.如以下test函数中,不可以加写成 function test(x,y="word",z){ } fun ...

  6. Abaqus 子模型法 和 子结构法

    目录 1 子模型法 1.2 子模型法应用考虑因素 1.3 子模型法关键技术 1.3.1 单元选择 1.3.2 驱动变量 1.3.3 链接整体模型和子模型 1.4 仿真过程 1.4.1 问题描述 1.4 ...

  7. 在 Windows Azure 网站中进行纵向扩展和横向扩展

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Byron Tardif 撰写. 当您开始一个新的 Web 项目,或者刚刚开始开发一般的网站和应用程序时,您可能希望从小处着手. ...

  8. 扩展gcd求逆元

    当模数为素数时可以用费马小定理求逆元. 模数为合数时,费马小定理大部分情况下失效,此时,只有与模数互质的数才有逆元(满足费马小定理的合数叫伪素数,讨论这个问题就需要新开一个博客了). (对于一个数n, ...

  9. CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)

    Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...

  10. 理解水平扩展和垂直扩展 (转载 http://yunjiechao-163-com.iteye.com/blog/2126981)

      当一个开发人员提升计算机系统负荷时,通常会考虑两种方式垂直扩展和水平扩展.选用哪种策略主要依赖于要解决的问题 以及系统资源的限制.在这篇文章中我们将讲述这两种策略并讨论每种策越的优缺点.如果你已经 ...

随机推荐

  1. .NET EF查询需要注意的点

    记录下在公司中混乱使用跟踪和非跟踪查询的坑. var blog = context.Blogs.Single(b => b.BlogId == 1); // 查询时放回一条 如果存在多条引发异常 ...

  2. MySQL8 概述、下载、安装、使用(Windows2019和centos7.9)

    MySQL8 概述.下载.安装.使用(Windows2019和centos7.9) 1.MySQL概述 1.1 数据库相关概念在这一部分,先了解三个概念:数据库.数据库管理系统.SQL. 名称 全称 ...

  3. 层叠样式表(CSS)1

    一.css的简介 1.层叠样式表的含义 层叠样式表:css是不仅是表现HTML的语言.还是进行样式修饰的语言 层叠:是对一个元素多次设置同一个样式,层层叠加覆盖,如不同的样式对一html标签进行修饰, ...

  4. 仅三天,我用 GPT-4 生成了性能全网第一的 Golang Worker Pool,轻松打败 GitHub 万星项目

    目录 1. 我写了一个超牛的开源项目 1.1 你看看这性能 1.2 你看看这功能 1.3 你猜我这一百天都经历了啥 2. 你有多久没写并发程序了? 3. 问:一个 Worker Pool 程序需要包含 ...

  5. 基于Prometheus搭建监控平台

    目录 前言 配置server单节点 prometheus.service 配置node节点 配置mysql监控 在数据库中添加exporter账户 修改mysql_exporter的配置 添加serv ...

  6. 记一次 .NET某报关系统 非托管泄露分析

    一:背景 1. 讲故事 前段时间有位朋友找到我,说他的程序内存会出现暴涨,让我看下是怎么事情?而且还告诉我是在 Linux 环境下,说实话在Linux上分析.NET程序难度会很大,难度大的原因在于Li ...

  7. Flutter系列文章-Flutter UI进阶

    在本篇文章中,我们将深入学习 Flutter UI 的进阶技巧,涵盖了布局原理.动画实现.自定义绘图和效果.以及 Material 和 Cupertino 组件库的使用.通过实例演示,你将更加了解如何 ...

  8. 关于 LLM 和图数据库、知识图谱的那些事

    本文整理自 NebulaGraph 布道师 wey 在「夜谈 LLM」主题分享上的演讲,主要包括以下内容: 背景 LLM RAG Graph 知识抽取 Text2Cypher Graph RAG 未来 ...

  9. 《Kali渗透基础》14. 无线渗透(四)

    @ 目录 1:相关工具 1.1:Aircrack-ng 1.1.1:airmon-ng 1.1.2:airodump-ng 1.1.3:aireplay-ng 1.1.4:airolib-ng 1.1 ...

  10. 《数据结构-C语言》单链表

    @ 目录 单链表 结构定义 初始化 建立 清空 求表长 判断是否为空表 取值 查找 插入 删除 销毁 遍历打印 测试 单链表 结构定义 #include <stdio.h> #includ ...