一、通过同余方程通解,算出\(X\)的最小正整数解
上面的通解$\displaystyle x =x_0+ \frac{b}{gcd(a,b)} *k $
本题\(gcd(a,b)=1\)
所以
$\displaystyle x =x_0+ b *k $
由裴蜀定理知道,\(x\)是\(b\)的倍数,
最后我们要把\(x\)拉到最小整数,所以:\((b + x \% b) \% b\)
如果\(x\)比最小整数大,则\(x \% b\)
如果\(x\)是很很小的负数,\(x \% b\)把\(x\)拉到\((-b, b)\)之间, 然后再\(+b\)就变成最小整数。
二、实现代码
#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 a, b;
cin >> a >> b;
int x, y;
exgcd(a, b, x, y);
//写法1:
cout << (x % b + b) % b << endl;
//写法2:
// if (b < 0) b = -b;
// int ans = x % b;
// while (ans <= 0) ans += b;
// cout << ans << endl;
return 0;
}