#include<iostream>
using namespace std;
int a = 0, b = 0, x = 0, y = 0;
void exgcd(int a, int b, int &x, int &y)
{
if (b == 0) {
x = 1;
y = 0;
}
else
{
exgcd(b, a%b, y, x);
y -= x*(a / b);
}
}
int main()
{
cin >> a >> b;
exgcd(a, b, x, y);
x = ((x%b) + b) % b;
cout << x;
return 0;
using namespace std;
int a = 0, b = 0, x = 0, y = 0;
void exgcd(int a, int b, int &x, int &y)
{
if (b == 0) {
x = 1;
y = 0;
}
else
{
exgcd(b, a%b, y, x);
y -= x*(a / b);
}
}
int main()
{
cin >> a >> b;
exgcd(a, b, x, y);
x = ((x%b) + b) % b;
cout << x;
return 0;
}
具体的数学推导网上有,我是通过算法导论学来的,感觉讲的非常清楚
这里要提到的是最后的那一段x = ((x%b) + b) % b;
因为要求最小值
x最开始求出的任意解的范围是(-b,b)
再+b就变成了(0,2b)
在mod b就变成了(0,2)就是最小解啦