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. Java扩展Nginx之二:编译nginx-clojure源码

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 为什么要编译nginx-clojure源码 作为< ...

  2. 投个 3D 冰壶,上班玩一玩

    ​本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟. Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎,它使用 JavaScript 语言编写,并且基于 Oi ...

  3. PDF转换OFD(Java实用版)

    前言: 在项目中用到了,就写一下哈 OFD简介 百度百科:https://baike.baidu.com/item/OFD/56227163?fr=aladdin OFD(Open Fixed-lay ...

  4. TCP 链接关闭 -- 客户端为什么需要60秒的time_wait状态

    客户端主动关闭连接时( FIN-> ACK<- FIN<- ACK->),在发送最后一个ack后会进入TIME_WAIT状态,停留2个MSL时间,进入CLOSED状态 MSL就 ...

  5. python教程 入门学习笔记 第3天 编程基础常识 代码注释 变量与常量

    编程基础常识 一.注释 1.对代码的说明与解释,它不会被编译执行,也不会显示在编译结果中 2.注释分为:单行注释和多行注释 3.用#号开始,例如:#这是我的第一个python程序 4.注释可以写在单独 ...

  6. Docker容器怎么安装Vim编辑器

    ​ 在现代软件开发和系统管理中,Docker已经成为一个不可或缺的工具.它允许我们轻松地创建.部署和运行应用程序,以及构建可移植的容器化环境.然而,在Docker容器中安装特定的工具可能会有一些挑战, ...

  7. 【pandas小技巧】--花哨的DataFrame

    最近github上发现了一个库(plottable),可以用简单的方式就设置出花哨的 DataFrame 样式. github上的地址:https://github.com/znstrider/plo ...

  8. (2023.7.15)软件加密与解密-番外1-PWN2REVERSE[XDbg]

    /提示:如果你看到了这行文字,那说明您的预览器不支持内嵌 CSS 代码,请使用 VSCode 阅读本 Markdown 文件/ 每天一个技术点 (2023.7.15)软件加密与解密-番外1-PWN2R ...

  9. 前端Vue仿企查查 天眼查知识产权标准信息列表组件

    ​ 引入Vue仿企查查天眼查知识产权标准信息列表组件 随着技术的不断发展,传统的开发方式使得系统的复杂度越来越高.在传统开发过程中,一个小小的改动或者一个小功能的增加可能会导致整体逻辑的修改,造成牵一 ...

  10. Blazor前后端框架Known-V1.2.14

    V1.2.14 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...