51nod 1069【思维】

具体思路来自相关讨论
给个不太严谨的证明思路:
第一步:证明路径可逆,也就是如果(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;
}

posted @ 2016-09-08 10:55  see_you_later  阅读(136)  评论(0编辑  收藏  举报