102 扩展欧几里得

// 102 扩展欧几里得.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*

http://oj.daimayuan.top/course/21/problem/487
输入T,一共T组数据,每组两个数a,b
,输出ax−by=gcd(a,b)的最小非负整数解(x,y)。

输入格式
第一行一个数字T。

接下来T行,每行两个数字a,b。

输出格式
一共T行,每行两个数,表示x,y。

输入样例
2
1 2
100 150
输出样例
1 0
2 1
数据规模
对于100%
的数据,保证1≤T≤104,1≤a,b≤109。
*/


#include <iostream>


using namespace std;

int T, a, b;


int exgcd(int a, int b, int& x, int& y) {
	if (!b) {
		x = 1, y = 0;
		return a;
	}
	int d = exgcd(b, a % b, x, y);
	int t = y;
	y = x - a / b * y;
	x = t;

	return d;
}



void solve() {
	cin >> a >> b;
	int x, y;
	int d = exgcd(a, b, x, y);
	if (x < 0 || y>0) {
		x += b / d; y -= a / d;
	}
	y = -y;
	cout << x << " " << y << endl;
}


int main()
{
	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}

 

posted on 2025-01-17 12:01  itdef  阅读(11)  评论(0)    收藏  举报

导航