/*
设过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,则两青蛙能相遇,否则不能。
所以原问题可用扩展欧几里德解方程。
*/

代码:

View Code 
 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

posted on 2012-07-30 12:49  pony1993  阅读(619)  评论(1编辑  收藏  举报

View My Stats