51 Nod 1247 可能的路径(数学)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51 Nod 1247 可能的路径(数学)相关的知识,希望对你有一定的参考价值。
题目链接:点我点我
题意:中文题
题解:一位大佬写了一段很精妙的证明(转):
给个不太严谨的证明思路:
第一步:证明路径可逆,也就是如果(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)
OrzOrz...,总结一下就是证明路径可逆,让(a,b)点和(x,y)点到中间的某个点,然后转成GCD,如果两个点GCD相同,就说明可以在中间某个点相遇,符合条件。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 typedef long long LL; 6 LL gcd(LL a,LL b){ 7 return b==0 ? a : gcd(b,a%b); 8 } 9 10 int main(){ 11 int t; 12 LL a,b,x,y; 13 cin>>t; 14 while(t--){ 15 cin>>a>>b>>x>>y; 16 if(gcd(a,b)==gcd(x,y)) cout<<"Yes"<<endl; 17 else cout<<"No"<<endl; 18 } 19 20 return 0; 21 }
以上是关于51 Nod 1247 可能的路径(数学)的主要内容,如果未能解决你的问题,请参考以下文章