AcWing 877. 扩展欧几里得算法
. 扩展欧几里得算法
一、题目描述
给定 对正整数 ,对于每对数,求出一组 ,使其满足 。
输入格式
第一行包含整数 。
接下来 行,每行包含两个整数 。
输出格式
输出共 行,对于每组 ,求出一组满足条件的 ,每组结果占一行。
本题答案不唯一,输出任意满足条件的 均可。
数据范围
输入样例
2
4 6
8 18
输出样例
-1 1
-2 1
样例理解:
- 一组可行解:
- 一组可行解:
二、裴蜀定理
裴蜀定理
若,是整数,且,那么:
-
对于任意的整数,,都一定是的倍数
-
一定存在整数,,使成立
裴蜀定理推论
互质 存在整数,,使得
举栗子
那么,,,,是的倍数,所以这个方程一定有整数解。
,就是一个整数解,还可以有,也是一组整数解。
注意:如果一个二元一次方程有正整数解,那么不只是一组解
再举栗子
有没有整数解呢?没有,因为是除不开的,所以没有整数解!
如何求贝祖数?
什么是贝祖数?
比如:,那么符合这个等式的,就是一组 贝祖数
可以使用 扩展欧几里得算法求贝祖数
举个栗子:
求 ,有没有合适的,也就是求贝祖数
通过贝祖定理看一下,它是不是有解: ,是的倍数,所以此方程一定有解,那么解是什么呢?
扩展欧几里得算法的推导过程:
在中,我们实际是求不定方程,并且,我们所返回的值,是这组解的最大公因数。
所以我们最后得到的解,要通过来进行一个小小的转换,得到一组解
算法实现过程证明
()、当 时
,也就是:,所以。
那么呢?因为普遍意义上的求贝祖数,一般是指不小于零的一组解,那么不小于的第一个可能值就是:,所以,可以将做为一组特解返回,也就是返回了一组不小于零的贝祖数。
()、当 时
【原计算式】
【辗转相除法】
① 【变量互换,最终是一致滴~】
②【用整除向下取整来描述扣去中所有的,剩下的就是余数】
将②代入①
三、实现代码
#include <bits/stdc++.h>
using namespace std;
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() {
int n;
cin >> n;
while (n--) {
int a, b;
cin >> a >> b;
int x, y;
exgcd(a, b, x, y);
printf("%d %d\n", x, y);
}
return 0;
}
四、三者之间的关系
1. 裴蜀定理
-
对于任意一对正整数,一定存在非零整数使得
-
可以用来判断方程是否有解,只要看是否是的倍数
2. 扩展欧几里得算法
如果方程有解,那么扩欧可以求方程一组解()
3.线性同余方程
给定构造出使得成立
(是整数)
由此可知
令则有
则构造一定使得有解
根据裴蜀定理可知该方程有解的充要条件是
设,若则不存在
若,则可以用 扩展欧几里得算法 算出的
再将得到与
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-10-07 课堂上用人脸识别“记录分析”学生表情?我反对!
2019-10-07 jetbreains的crack方法
2015-10-07 现行开发模块测试地址