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

题目链接

知道算法后,就简单多了,虽然对算法也不是很懂,套上模版就能过。

 1 /*POJ 1061 青蛙的约会
 2 从题意中很容易得到等式x+mt = y+nt(mod L)//t代表时间
 3 移动左右得到 (m-n)t = y-x(mod L);
 4 所以 得到(m-n)*a - L*b = y-x的扩展欧几里得,求解a,套上模版就OK了。
 5 */
 6 #include <stdio.h>
 7 #include <string.h>
 8 __int64 x,y;
 9 __int64 ext_eucld(__int64 a,__int64 b)
10 {
11     __int64 t,d;
12     if(b == 0)
13     {
14         x = 1;
15         y = 0;
16         return a;
17     }
18     d = ext_eucld(b,a%b);
19     t = x;x = y;y = t-(a/b)*y;
20     return d;
21 }
22 int main()
23 {
24     __int64 m,n,l,a,b,d,ans;
25     scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&m,&n,&l);
26     b = ((b-a)%l+l)%l;//注意把b-a,m-n变为正数
27     m = ((m-n)%l+l)%l;
28     d = ext_eucld(m,l);
29     if(b%d)
30     {
31         printf("Impossible\n");
32     }
33     else
34     {
35     l /= d;
36     ans = (x*(b/d)%l+l)%l;
37     printf("%I64d\n",ans);
38     }
39     return 0;
40 }
posted @ 2012-07-30 13:26  Naix_x  阅读(179)  评论(0编辑  收藏  举报