CSES - BAPC 2015 - Results
Submission details
Task:Wipe Your Whiteboards
Sender:Antti Röyskö
Submission time:2017-10-17 18:33:53 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.04 sdetails
#2ACCEPTED0.04 sdetails
#3ACCEPTED0.04 sdetails
#4ACCEPTED0.04 sdetails

Code

#include <iostream>
#include <utility>
typedef long long ll;

// return gcd(a, b), and c and d for which ac + bd = gcd(a, b)
std::pair<ll, std::pair<long long, long long>> ext_euc(ll a, ll b) {
	if (a < b) {
		auto res = ext_euc(b, a);
		return {res.first,{res.second.second, res.second.first}};
	} else {
		ll k = a / b;
		if (a == k * b) {
			return {b, {0, 1}};
		} else {
			auto sub = ext_euc(b, a - k * b);
			return {sub.first, {sub.second.second, sub.second.first - k * sub.second.second}};
		}
	}
}


int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(0);

	ll t;
	std::cin >> t;

	for (ll j = 0; j < t; ++j) {
		ll r, s, q;
		std::cin >> r >> s >> q;
		// find a and b such that
		// ar + bs = q
		// and a>=1 and b>=1 and they are minimal
		auto res = ext_euc(r, -s);
		ll gcd = res.first;
		ll a = res.second.first;
		ll b = res.second.second;
		a *= q / gcd;
		b *= q / gcd;
		// ar - bs = q
		ll bg = r / gcd;
		ll ag = -s / gcd;
		//std::cout << a << ' ' << b << ' ' << ag << ' ' << bg << '\n';
		ll k = (ag - a) / ag;
		a += ag * k;
		b -= bg * k;
		k = (a-1) / ag;
		a -= k * ag;
		b += k * bg;
		if (b >= 0) {
			k = 1 + (b / bg);
			a += k * ag;
			b -= k * bg;
		}
		std::cout << a << ' ' << -b << '\n';
	}
}

Test details

Test 1

Verdict: ACCEPTED

input
243
2 -2 2
2 -2 4
2 -2 6
2 -3 1
...

correct output
2 1
3 1
4 1
2 1
4 2
...

user output
2 1
3 1
4 1
2 1
4 2
...

Test 2

Verdict: ACCEPTED

input
100
37519548 -81935448 71983128
12441731 -99044784 98614084
99608264 -5674831 20315968
7288065 -67360366 2498082
...

correct output
4207392 1926631
64596284 8114405
3401796 59710496
21767778 2355168
4956464 1069368
...

user output
4207392 1926631
64596284 8114405
3401796 59710496
21767778 2355168
4956464 1069368
...

Test 3

Verdict: ACCEPTED

input
50
6387854 -19137400 28428
8306928 -18469944 46440
7145568 -427420 25800
4298766 -20849718 63474
...

correct output
48282 16116
37565 16895
2265 37866
11427 2356
43311 40524
...

user output
48282 16116
37565 16895
2265 37866
11427 2356
43311 40524
...

Test 4

Verdict: ACCEPTED

input
6
2 -2 2
2 -2 10
3 -2 1
3 -2 4124
...

correct output
2 1
6 1
1 1
1376 2
1 2
...

user output
2 1
6 1
1 1
1376 2
1 2
...