码迷,mamicode.com
首页 > 其他好文 > 详细

51 Nod 1247 可能的路径(数学)

时间:2017-09-16 13:32:07      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:ref   problem   ...   思路   ret   www   pre   数学   typedef   

题目链接:点我点我

题意:中文题

题解:一位大佬写了一段很精妙的证明(转):

给个不太严谨的证明思路:

第一步:证明路径可逆,也就是如果(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 可能的路径(数学)

标签:ref   problem   ...   思路   ret   www   pre   数学   typedef   

原文地址:http://www.cnblogs.com/Leonard-/p/7530780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!