您的位置:首页 > 其它

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)

由此联想到欧几里得算法求解最大公约数的过程,不用多说了。。。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: