裴蜀定理:
1.对于任意一对正整数a,b ,一定存在非零整数x,y,使得ax+by==gcd(a,b);
2. 且gcd(a,b)是x,y所能凑出来的最小的正整数。
好的,那么我们该怎么求这个x,y呢?下面就是主角:扩展欧几里得算法
那么欧几里得是什么呢?其实就是gcd....
核心思想即:gcd(a,b)==gcd(b,a%b);
简单证明如下:
gcd(a,b)=r;
a=k1r;
b=k2r;
a%b==k1r%k2r==(k1%k2)r
然后我们可以看到两个式子是等价的,一直递归下去直到b=0结束;
继续扩展欧几里得:)
#include<iostream>
#include<cstdio>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);//b与y,a与x对应起来;
y-=(a/b)*x;
return d;
}
int main()
{
int n;
cin>>n;
int a,b,x,y;
while(n--)
{
cin>>a>>b;
exgcd(a,b,x,y);
printf("%d %d\n",x,y);
}
return 0;
}