题目
给定 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
理解写法
#include <iostream>
using namespace std;
int exgcd(int a, int b, int &x, int &y){
if(!b){
x = 1, y = 0;//a*1 + 0*0 == gcd(a,0)
return a;
}
// gcd(a,b) == gcd(b,a%b) == gcd(b,a - (a/b)*b) == b*x1 + (a-(a/b)*b)*y1
//== a*x + b*y //== a*y1 + b*(x1-(a/b)*y1)
// 则x = y1, y = x1 - (a/b)*y1
int x1, y1;
int d = exgcd(b,a%b, x1, y1);//递归先求x1和y1
// 更新x和y
x = y1;
y = x1 - (a/b)*y1;
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;
}
模板写法
#include <iostream>
using namespace std;
int exgcd(int a, int b, int &x, int &y){
if(!b){
x = 1, y = 0;//a*1 + 0*0 == gcd(a,0)
return a;
}
int d = exgcd(b,a%b, y, x);//递归求最大公约数
// 更新y即可,x不变
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;
}