给定n对正整数ai,bi,对于每对数,求出一组xi,yi,使其满足ai∗xi+bi∗yi=gcd(ai,bi)。
输入格式
第一行包含整数n。
接下来n行,每行包含两个整数ai,bi。
输出格式
输出共n行,对于每组ai,bi,求出一组满足条件的xi,yi,每组结果占一行。
本题答案不唯一,输出任意满足条件的xi,yi均可。
数据范围
1≤n≤105,
1≤ai,bi≤2∗109
输入样例:
2
4 6
8 18
输出样例:
-1 1
-2 1
想法:
//题解成立的前提下
ax + by = gcd(a,b)
by+(a%b)y=gcd(b,a%b)
因为 gcd(a,b) = gcd(b,a%b)
所以 ax +by = bx2+(a%b)y2
= bx2 +(a- ⌊a/b⌋)y2
= ay2 + b ( x2 - a/b * y2 )
所以算得 x=y2 ; y = ( x2 - a/b * y2 )
又因为 ① exgcd(a,b,x,y) 和 ② exgcd(b , a%b , y , x)
所以当取得②时,y = x2 ; x = y2
由因为等式替换后 ① 的 y = ( x2 - a/b * y2 )
所以此时 y = y - a/b * x = ( x2 - a/b * y2 )
x不需要进行操作 已经等于y2
结尾判断条件:b==0
此时 ax+0*y = gcd(a,0) = a ;
所以可取 x=1;y=0;
代码:
#include<iostream>
using namespace std;
void exgcd(int a,int b,int &x,int &y){ //此处需要& 赋值
if(b==0){
x=1;
y=0;
return ;
}
exgcd(b,a%b,y,x);
y -= a/b * x;
}
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;
}