题目链接: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)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 "); 23 else 24 { 25 k1 *= ((x - y) / d); 26 INT r = l / d; 27 k1 = (k1 % r + r) % r; 28 printf("%lld ",k1); 29 } 30 return 0;