51nod 1069【思维】
2016-09-08 10:55
190 查看
具体思路来自相关讨论
给个不太严谨的证明思路:
第一步:证明路径可逆,也就是如果(a, b) -> (x, y)可行,则(x, y) - > (a, b)可行
这个比较直观,只需要分别由(a +b, b) (a, a + b), (a - b, b), (a, a - b)推回(a, b)即可:
例如:(a, a - b) - > (b, a - b) - > (b, a) -> (a + b, a) - > (a + b, b) -> (a, b)
(a, a + b)->(2a + b, a + b) - > (2a + b, a)->(a + b, a) ->(a+b, b) ->(a, b)
注意这里也顺手说明了(a, b)->(b, a)可行
第二步:既然路径可逆,那题目的可以这样改写:是否存在点(m, n)使得(a, b) -> (m, n)可行且,(x, y)->(m, n)可行
因为(a, b) -> (b, a)可行,则不失一般性,可假设:a > b
可以这样逐次推导:(a, b) -> (a - b, b) -> (a - 2b, b)-> … ->(a - nb, b),其中, n = a / b, 则,改写一下:
(a, b) - > (a % b, b) ->(b, a % b)
由此联想到欧几里得算法求解最大公约数的过程,不用多说了。。。
给个不太严谨的证明思路:
第一步:证明路径可逆,也就是如果(a, b) -> (x, y)可行,则(x, y) - > (a, b)可行
这个比较直观,只需要分别由(a +b, b) (a, a + b), (a - b, b), (a, a - b)推回(a, b)即可:
例如:(a, a - b) - > (b, a - b) - > (b, a) -> (a + b, a) - > (a + b, b) -> (a, b)
(a, a + b)->(2a + b, a + b) - > (2a + b, a)->(a + b, a) ->(a+b, b) ->(a, b)
注意这里也顺手说明了(a, b)->(b, a)可行
第二步:既然路径可逆,那题目的可以这样改写:是否存在点(m, n)使得(a, b) -> (m, n)可行且,(x, y)->(m, n)可行
因为(a, b) -> (b, a)可行,则不失一般性,可假设:a > b
可以这样逐次推导:(a, b) -> (a - b, b) -> (a - 2b, b)-> … ->(a - nb, b),其中, n = a / b, 则,改写一下:
(a, b) - > (a % b, b) ->(b, a % b)
由此联想到欧几里得算法求解最大公约数的过程,不用多说了。。。
#include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { LL x,y,a,b; LL g1,g2; int T; scanf("%d",&T); while(T--) { cin>>a>>b>>x>>y; g2=__gcd(a,b); g1=__gcd(x,y); if(g1==g2) puts("Yes"); else puts("No"); } return 0; }
相关文章推荐
- 51nod 1201 整数划分(锻炼思维的好题)
- 51nod【1381】硬币游戏【思维】
- 51Nod 1272(思维题)
- 51nod 1099 贪心/思维
- 51nod 5172(单调栈/思维)
- 51nod 1069 Nim游戏
- 51nod_1069 Nim游戏
- 【51Nod】1347 - 旋转字符串(思维)
- 【51nod】-1001 数组中和等于K的数对(思维)
- 51nod 1548 欧姆诺姆和糖果 (思维 枚举)
- 51nod 1396 还是01串 (思维or前缀和)
- 51NOD 1995 三子棋 【思维打表+图解】
- 51Nod - 1215 数组的宽度 思维+单调栈
- 51nod 1069 Nim游戏
- 【51Nod】1413 - 权势二进制(思维)
- 51nod 1421 最大MOD值 & codeforces 485D Maximum Value(思维 数学)
- 【51nod】---硬币游戏(思维&&数学)
- 51nod 1069 Nim游戏 (博弈论)
- 51nod 1414 冰雕【思维+暴力】
- 51Nod - 1276 思维题