/*
x*a+y*b = gcd(a,b) xy是系数 ab是变量
到达递归边界 也就是b == 0时 a=gcd(a,b)
每次gcd(a,b) = gcd(b,a%b)我们都求出了下一次,b和a%b的最大公约数
而且b*x+(a%b)*y = gcd 又a%b = a-(a/b)*b
带入得y*a+(x–a/b*y)*b = gcd
发现 x = y , y = x–a/b*y
凡是能用ax+by凑出来的数 一定是gcd(a,b)的倍数
*/
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int exgcd(int a , int b , int &x, int &y){//注意系数是传址的
if(!b){//b=0的话
x = 1 , y = 0;//这就是递归边界时候的情况
return a;
}
int d = exgcd(b,a%b,y,x);//整个过程就是更新x,y 也就是ab系数的过程 首先参数就是把xy互换了
y -= a / b * x;//这里是一个编程技巧 否则还要多引入一个临时变量存y 等价于y = y-a/b*x
return d;
}
int main(){
int n;
cin >>n;
while(n--){
int a,b,x,y;
scanf("%d%d",&a,&b);
exgcd(a,b,x,y);
printf("%d %d\n",x,y);
}
return 0;
}