CF1612 D. [X-Magic Pair]


CF1612D. D. X-Magic Pair

题目大意

给出\(t\)组数据,每组数据给出\(a,b,x\)三个数

对于\(a,b\),可以分别作出两种操作

\(a := |a - b|\)

\(b := |a - b|\)

求问,能否通过一系列操作,使\(a,b\)最终的数值满足\(a = x\)\(b = x\)

如果可以满足,输出YES,否则输出NO


解题思路

为了方便解题,我们使 \(a,b\) 始终满足 \(a > b\)

对于一对 \(a,b\) ,考虑对 \(a\) 进行操作,如果此时能通过若干次操作,使得要求被满足,那么我们可以记作 \(a - p * b = x\),要使得一个正整数\(p\)存在,需要满足 \(\left\{\begin{array} xx \%b = a\%b\\ x <=a\end{array}\right.\) ,当方程组被满足时,说明有解。

如果此时无解,我们可以对余下的数继续进行操作,这就相当于对 \(b , a\%b\) 这一对数继续进行求解。这一部分我们可以通过递归来实现。

过程中需要对 \(b = 0\) 的情况进行特判,此时当且仅当 \(x = a\) 时,有解


代码

#include
using namespace std;
using ll = long long;
ll f(ll a, ll b, ll x) {
	if (b == 0)
		return x == a;
	if (x <= a && x % b == a % b)
		return 1;
	return f(b, a % b, x);
}

void solve() {
	ll a, b, x;
	cin >> a >> b >> x;
	if (a < b)
		swap(a, b);
	if (f(a, b, x))
		cout << "YES\n";
	else
		cout << "NO\n";
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}