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 }

你可能感兴趣的:(poj)