【总结】综合测试3

X-Magic Pair

Description

给一个数对 \((a,b)\),每次可以进行操作 \((a, b)\) \(\to\) \((a, \vert a - b \vert)\)\((\vert a - b \vert, b)\)。问最后能否令 \(a = x\)\(b = x\)\(a,b,x \leq 10^{18}\)

Solution

我们先让 \(a \geq b\)
我们考虑第一步,可以达到两个状态 \((a - b, b)\)\((a, a - b)\)

对于右边的状态 \((a, a - b)\),显然下一步能到达的状态为 \((a - b, b)\)\((a, a)\)。一个是走回去了,一个是和左边一样。

所以这两个状态我们可以当它们是等价的,直接判断一下右边这个状态然后往左边的跳即可。

考虑 \((a - b, b)\),如果 \(a - b \geq b\),则可到达状态为 \((a - 2 \cdot b, b)\)\((a − b, a − 2 \cdot b)\)

与上面是同样的道理,显然右边的状态可以到达左边。

那么相当于一直让 \(a - b\),直到 \(a < b\),也就相当于令 \(a\) 变为 \(a \mod b\)。与 \(gcd\) 类似。

所以我们只需要每次由 \((a, b)\)\((a \mod b, b)\) 递归即可。

Code

#include <cstdio>
#include <cmath>
#include <iostream>
#define int long long
using namespace std;
int T;
bool flag;
void dfs(int a, int b, int x) {
	if (a < b)
		swap(a, b);
	if (a == x || b == x) {
		flag = 1;
		return ;
	}
	if (!a || !b)
		return ;
	if (x > a)
		return ;
	if (x % b == a % b) {
		flag = 1;
		return ;
	}
	return dfs(a % b, b, x);
}
signed main() {
	scanf("%lld", &T);
	while (T--) {
		int a, b, x;
		scanf("%lld %lld %lld", &a, &b, &x);
		flag = 0;
		dfs(a, b, x);
		if (flag)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

斗地主

Description

Solution

Code

网络连接

Description

Solution

Code

金字塔

Description

Solution

Code

最多的个数

Description

Solution

Code

posted @ 2022-08-17 14:55  zhou_ziyi  阅读(13)  评论(0)    收藏  举报