[AcWing]877. 扩展欧几里得算法(C++实现)扩展欧几里得算法模板题
1. 题目
2. 读题(需要重点注意的东西)
思路:
裴蜀定理
对于任意正整数a,b;一定存在非零整数x,y,使得:
ax + by = gcd(a,b)
其中gcd(a,b)指a和b的最大公约数
欧几里得算法
a 和 b 的最大公约数 = b 和 a mod b的最大公约数
扩展欧几里得算法的作用
找出满足裴蜀定理的一组 x 和 y
3. 解法
---------------------------------------------------解法---------------------------------------------------
#include <iostream>
#include <algorithm>
using namespace std;
void exgcd(int a, int b, int &x, int &y)
{
if(!b) // ① 如果b为0,输出一组可能的解 x = 1,y = 0
{
x = 1,y = 0;
return;
}
// ② 当b ≠ 0
exgcd(b, a % b, y, x);
y -= a / b * x ;
return;
}
int main()
{
int n;
scanf("%d", &n);
while (n -- )
{
int a, b;
scanf("%d%d", &a, &b);
int x, y; // 用扩展欧几里得算法来找到符合条件的x和y的值
exgcd(a, b, x, y);
printf("%d %d\n", x, y);
}
return 0;
}
可能存在的问题
为什么x不变,y变为y - a / b * x
?
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 欧几里得算法
- 扩展欧几里得算法
6. 总结
扩展欧几里得算法模板题,理解公式并背下代码。