题目描述
扩展欧几里得算法
求构成最大公约数的系数
欧几里得算法:gcd(a,b)=gcd(b,a mod b);
a mod b=a-[a/b]-b
ax+by=bx+(a mod b)y 即=ax+b(y-[a/b]x)y
C++ 代码
#include<iostream>
using namespace std;
int exgcd(int a,int b,int &x,int &y) //加引用使得x,y能一直变
{
if(!b) //如果b是0
{
x=1,y=0; //因为ax始终存在,这种情况为边界情况
return a;
}
int d=exgcd(b,a%b,y,x); //递推求最大公约数
y-=a/b*x; //相当于x,y与a,b系数互换
return d; //返回最大公约数
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b,x,y;
cin>>a>>b;
exgcd(a,b,x,y); //构造法求系数
cout<<x<<" "<<y<<endl;
}
return 0;
}