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 可能的路径(数学)的主要内容,如果未能解决你的问题,请参考以下文章

51Nod1247 可能的路径

51nod 1247可能的路径

51nod1247(gcd)

1247 可能的路径 逆向思维

51nod 1189 算术基本定理/组合数学

51nod 1837 砝码称重数学,规律