POJ 1061 青蛙的约会(扩展欧几里德)

/*
设过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

你可能感兴趣的:(poj)