/*
设过s步后两青蛙相遇,则必满足以下等式:
(x+m*s)-(y+n*s)=k*l
变形得:
(n-m)*s+k*l=x-y
令:
a=n-m,b=l,c=x-y
得:
a*s+b*k=c,根据扩展欧几里德:
只要c%gcd(a,b)==0,则两青蛙能相遇,否则不能。
所以原问题可用扩展欧几里德解方程。
*/
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4 __int64 exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
5 {
6 if(b==0)
7 {
8 x=1;
9 y=0;
10 return a;
11 }
12 __int64 d=exgcd(b,a%b,x,y);
13 __int64 t=x;
14 x=y;
15 y=t-(a/b)*x;
16 return d;
17 }
18 int main()
19 {
20 __int64 a,b,c,d,x,y,m,n,l,x1,y1;
21 scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l);
22 a=m-n;
23 b=l;
24 c=y-x;
25 if(a<0)
26 {
27 a=-a;
28 c=-c;
29 }
30 d=exgcd(a,b,x1,y1);
31 if(c%d)
32 puts("Impossible");
33 else
34 {
35 c/=d;
36 b/=d;
37 printf("%I64d\n",((c*x1)%b+b)%b);
38 }
39 return 0;
40 }
41
2 #include <cstdio>
3 using namespace std;
4 __int64 exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
5 {
6 if(b==0)
7 {
8 x=1;
9 y=0;
10 return a;
11 }
12 __int64 d=exgcd(b,a%b,x,y);
13 __int64 t=x;
14 x=y;
15 y=t-(a/b)*x;
16 return d;
17 }
18 int main()
19 {
20 __int64 a,b,c,d,x,y,m,n,l,x1,y1;
21 scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l);
22 a=m-n;
23 b=l;
24 c=y-x;
25 if(a<0)
26 {
27 a=-a;
28 c=-c;
29 }
30 d=exgcd(a,b,x1,y1);
31 if(c%d)
32 puts("Impossible");
33 else
34 {
35 c/=d;
36 b/=d;
37 printf("%I64d\n",((c*x1)%b+b)%b);
38 }
39 return 0;
40 }
41