Poj 1061 青蛙的约会(扩展GCD)

题目链接:http://poj.org/problem?id=1061

解题报告:两只青蛙在地球的同一条纬度线上,选取一个点位坐标轴原点,所以现在他们都在同一个首尾相连的坐标轴上,那么他们现在的位置分别是x和y,他们每次跳的时间是一样的,跳的距离分别是m,n,现在他们像同一个方向开始跳,要你求出最少跳多少步会出现在同一个位置。

扩展GCD,k * m + x - (k * n + y) = c * l;       //跳了k步之后相遇,这时候到原点的距离之差会是周长的整数倍

变形之后得:

k * (m - n) + (-c) * l = y -x

现在先求k * (m-n) + (-c) * l = GCD(m-n,l)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<deque>
 6 #include<set>
 7 using namespace std;
 8 typedef long long INT;
 9 INT extgcd(INT a, INT b, INT & x, INT & y)
10 {
11     if (b == 0) { x=1; y=0; return a; }
12     INT d = extgcd(b, a % b, x, y);
13     INT t = x; x = y; y = t - a / b * y;
14     return d;
15 }
16 int main()
17 {
18     INT x,y,m,n,l;
19     scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
20     INT k1,k2;
21     INT d = extgcd(n-m,l,k1,k2);
22     if((x - y) % d != 0) puts("Impossible\n");
23     else
24     {
25         k1 *= ((x - y) / d);
26         INT r = l / d;
27         k1 = (k1 %  r + r) % r;
28         printf("%lld\n",k1);
29     }
30     return 0;
View Code

 

posted @ 2014-07-30 12:16  xiaxiaosheng  阅读(165)  评论(0编辑  收藏  举报