题目
扩展欧几里得算法模板
思路
这是求解同余方程的问题,可以使用扩展欧几里得算法来解决。
先求解出 a a a和 b b b 的最大公约数 g g g,然后判断 g g g 是否等于 1 1 1。如果 d d d 不等于 1 1 1,则同余方程无解,返回 − 1 -1 −1。如果 g g g 等于 1 1 1,则使用扩展欧几里得算法求解出 a x + b y = 1 ax + by = 1 ax+by=1 的一组解 ( x , y ) (x, y) (x,y),然后将 x x x 对 b b b 取模,得到同余方程的最小正整数解
代码
#include <stdio.h>
typedef long long LL;
/**
* @brief 扩展欧几里得算法
*
* @param m 给定数之一
* @param n 给定数之一
* @param x 辅助变量
* @param y 辅助变量
* @return int m 和 n 的最大公约数
*/
int exgcd(int m, int n, LL* x, LL* y) {
if (!n) {
*x = 1;
*y = 0;
return m;
}
int g = exgcd(n, m % n, y, x);
*y -= m / n * *x;
return g;
}
int main(void) {
int t = 0, a = 0, b = 0, g = 0;
LL x = 0, y = 0;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &a, &b);
g = exgcd(a, b, &x, &y);
if (g != 1) {
printf("-1\n");
continue;
}
x = (x % b + b) % b;
printf("%d\n", x);
}
return 0;
}