exgcd (扩展欧几里得算法)入门

首先下一个结论

exgcd是通过类似辗转相除的方法,用\(O(\log N)\) 的时间复杂度计算以下这个方程的一组解

\[ax + by = \gcd(a,b) \]

首先,我们知道\(\gcd(a,b) = \gcd(b,a\% b)\) , 也就是 \(\gcd(a,b) = \gcd(b,a-\lfloor \frac{a}{b}\rfloor \times b)\)

所以我们可以先往下递归,先算出下一层方程,也就是 $$bx + (a-\lfloor \frac{a}{b}\rfloor \times b) y = \gcd(a,b)$$

这个方程的解。

由于是像辗转相除一样一层一层递归的,所以最终总会有 b = 0 的时候,那么这时有一个很显然的结论 x = 1 , y = 0;

于是现在考虑另一个问题,我们已经得到了上面这个方程的一组解,如何得到原始方程的解呢?

设已知的那组解是 \(x_1\)\(y_1\) , 把式子拆开 $$bx_1 + ay_1 - \lfloor \frac{a}{b}\rfloor \times by_1 = \gcd(a,b)$$

再合并一下

\[ay_1 - b(x_1 - \lfloor \frac{a}{b}\rfloor \times y_1) = \gcd(a,b) \]

嗯!惊奇的发现 x 和 y 似乎可以用已知量表示了,即

\[x = y_1 \]

\[y = x_1 - \lfloor \frac{a}{b}\rfloor \times y_1 \]

那么一直递归就可以求出最终解了

参考代码

inline void exgcd(int a ,int b ,int &x  ,int &y) {if(!b) {x = 1 , y = 0; return;}int x1 , y1;exgcd(b , a - a / b * b , x1 , y1); //第二个传参图方便也可以写a%by = x1 - a / b * y1; x = y1;}

这个时候我们可以进一步的扩展,求解方程$$ax + by = c$$

首先要知道一个东西,裴蜀定理

证明不重要,你只需要知道这个东西说明了如果在上面的方程里 \(gcd(a,b)\nmid c\) , 这个方程就是无整数解的。

那么其他情况下 \(gcd(a,b) \mid c\),只需在求出普通的解后 x 和 y 都乘以\(\frac{c}{\gcd(a,b)}\) 就好啦

大概就是这样了,可以做一下这道题洛谷P1082 同余方程,参考代码放这里了。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a,b;inline void exgcd(ll a,ll b,ll &x,ll &y)
{if(b==0){x=1,y=0; return;}ll x0,y0;exgcd(b,a%b,x0,y0);x=y0,y=x0-y0*(a/b);
}
int main()
{cin>>a>>b; ll ans1,ans2;exgcd(a,b,ans1,ans2);cout<<(ans1+b)%b;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899130.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3-DeepSeek-Chat流式AI对话|vite6+vant4+deepseek智能ai聊天助手

原创新作vue3.5+deepseek+vant4+vant4仿DeepSeek-R1流式输出ai聊天对话。 deepseek-vue3-chat : 实战2025智能大模型ai会话,基于Vue3+Vite6+OpenAI集成接入DeepSeek聊天小助手模板,支持流式打字输出效果、浅色/暗黑主题模式、代码高亮显示、针对移动端+PC端适配处理。🐬使用…

Sections 多列混排

学习点@Reusable 装饰器 WaterFlow瀑布流容器 模块组件 代码讲解效果图@Reusable 装饰器使用场景 @Reusable 是一个在 HarmonyOS ArkTS 中使用的装饰器,主要用于自定义组件的复用。从 API version 10 开始,@Reusable 装饰器得到了支持。它的主要功能是当一个标记为 @Reusable…

后缀数组(SA)学习笔记(倍增算法)

倍增求SA后缀数组是一个非常好的东西。一开始看不出来这个东西有什么用,但是它非常的有用。(以下 \(N\) 为字符串长度) 有了后缀数组,我们就可以在 \(O(N \log N)\) 的时间内:得到所有后缀的字典序关系。(最基本的功能) 求出任意两个子串的最长公共前缀 (LCP)。 求出字符…

Chat2DB 数据库客户端邀请码

推荐一款超好用的AI数据库管理工具Chat2DB,支持22种数据库,包括国产的达梦、OpenGuass、OceanBase、TiDB等,还有非关系型MongoDB、Redis等,快来试试吧! 🔥 官网:https://chat2db-ai.com/ 🔥 邀请码:622888 邀请码介绍:https://docs.chat2db-ai.com/docs/settings/i…

基于Java的全栈入门学习路线

Java全栈JavaSE数据库前端JavaWebSSM框架Linux学完以上可独立开发,下面是微服务协同开发 SpringBootSpringCloudHadoop

latex中如何重复引用已经存在的脚注?

在使用latex写论文的时候,如果要添加一个脚注,可以使用 \footnote{...}如果第二次出现相同内容的脚注,再写一次\footnote{...}会导致出现两个脚注,我们希望两处脚注链接到一处,可以这样写: 第一处脚注添加label: \footnote{...\label{llama3.2}}第二处及之后的脚注直接引…

编译libssh (Windows VS)

1、先编译依赖的zlib 下载地址 zlib Home Site 解压后,文件夹处——鼠标右键——VS Code打开,选择vs编译器,开始自动编译得到build目录 以管理员身份运行VS,打开build目录里的zlib.sln,我需要的是64位的,所以选择如下 ALL_BUILD处生成lib和dll,然后INSTALL处也生成下(自…

【学习笔记】wqs二分

其实写这个主要是想解释一下它的原理,教程、习题什么的网上都有,比如这个。 就拿这题来讲吧。 首先我们画出一个函数 \(f(x)\) 表示 \(s\) 的度恰好为 \(x\) 时,最小生成树的权值和。 当然,这个函数只会取在某一些整点上,我们把它连起来就行了。 然后你会发现它是下凸的(…

在vue2中引用高德地图,外卖骑手的路线规划

参照路径规划-参考手册-地图 JS API 1.4 | 高德地图APIAMap.RidingAMap.Riding骑行路径规划服务,提供起始、终点骑行路线查询服务。用户可以通过自定义回调函数取回并显示查询结果。若服务请求失败,系统将返回错误信息。 相关示例:位置经纬度 + 骑行路线规划-骑行路径规划-示…

软件分析——OBS Studio

课程社区链接:首页 - 2025年春季软件工程(罗杰、任健) - 北京航空航天大学 - 班级博客 - 博客园 (cnblogs.com) 作业要求链接:[I.2] 个人作业:软件案例分析 - 作业 - 2025年春季软件工程(罗杰、任健) - 班级博客 - 博客园 (cnblogs.com) 课程目标:让学生掌握软件开发的…

JDK7-时间类、时间格式化类--java进阶day07

1.Date类:表示时间的类 1.Date常用的构造方法.2.Date常用的成员方法1.getTime:返回从时间原点到对象设定的时间之间的时间2.setTime:将对象的时间设置为setTime里的时间 d3是此刻的时间,被setTime设置为了时间原点2.SimpleDateFormat类:时间格式化类 Date类默认的格式不好看…

RN里遇到初始计算值是一样的,布局位置却不一致的问题

在tabs切换下面的小动画 但在页面上显示确是这样的,只有切换回来一次后才显示正常。计算结果确始终都是7 问了下AI,说是,在RN中,布局计算是异步的。在组件首次渲染时,即使布局事件已经触发并且获取到了layout对象,实际DOM可能还没有完全应用这些尺寸。这会导致第一次动画…