POJ 1061 青蛙的约会

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

扩展欧几里得+线性同余方程

从题意中很容易得到等式x+mt = y+nt(mod L)//t代表时间
移动左右得到 (m-n)t = y-x(mod L);
所以 得到(m-n)*a - L*b = y-x的扩展欧几里得,求解a,套上模版就OK了。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 __int64 x,y;
 4 __int64 ext_eucld(__int64 a,__int64 b)
 5 {
 6     __int64 t,d;
 7     if(b == 0)
 8     {
 9         x = 1;
10         y = 0;
11         return a;
12     }
13     d = ext_eucld(b,a%b);
14     t = x;x = y;y = t-(a/b)*y;
15     return d;
16 }
17 int main()
18 {
19     __int64 m,n,l,a,b,d,ans;
20     scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&m,&n,&l);
21     b = ((b-a)%l+l)%l;//注意把b-a,m-n变为正数
22     m = ((m-n)%l+l)%l;
23     d = ext_eucld(m,l);
24     if(b%d)
25     {
26         printf("Impossible\n");
27     }
28     else
29     {
30     l /= d;
31     ans = (x*(b/d)%l+l)%l;
32     printf("%I64d\n",ans);
33     }
34     return 0;
35 }
posted @ 2012-08-03 21:23  时光旅行的懒猫  阅读(232)  评论(0编辑  收藏  举报