【总结】综合测试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
本文来自博客园,作者:zhou_ziyi,转载请注明原文链接:https://www.cnblogs.com/zhouziyi/p/16595226.html

浙公网安备 33010602011771号