题述
输入输出
数据范围
样例
概述
因为a和b 、a和b都是gcd(a,b)gcd(a,b)的倍数,则ax+by也一定是gcd(a,b)的倍数ax+by也一定是gcd(a,b)的倍数,所以ax+byax+by能凑出来的最小的数就是gcd(a,b)
即gcd(a,b)=d
想求两个系数x,y
有ax+by=d
gcd(a,b)=gcd(b,a mod b)
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
当到达递归边界的时候,b==0,a=gcd(a,b)这时可以观察出来这个式子的一个解:a∗1+b∗0=gcd(a,b),x=1,y=0,但此时的a和b已经不是最开始的a和b了
而对于本题:
代码:
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
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);
cout << (x%b+b)%b << endl;
return 0;
}
小知识
%与mod的区别
%出来的数有正有负,符号取决于左操作数。而mod只能是正(因为a = b * q + r (q > 0 and 0 <= r < q)
所以要用%来计算mod的话就要用这样的公式:a mod b = (a % b + b) % b