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

点我看题目

题意 : 中文题不详述。

思路 : 设经过s步后两青蛙相遇,则必满足(x+m*s)-(y+n*s) = K*L(k = 0,1,2....)

变形得:(n-m)*s+K*L = x-y ;

另a = n-m,b = L,c = x-y,则上式变为a*s+b*k = c。于是就变成了扩展欧几里德,求解不定方程,线性同余方程。只要上式存在整数解,则这两个青蛙能相遇,否则不能。

 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <iostream>

 4 #include <math.h>

 5 

 6 using namespace std ;

 7 

 8 #define LL long long

 9 

10 LL gcd(LL a,LL b)

11 {

12     return b == 0 ? a : gcd(b,a%b) ;

13 }

14 

15 void exeulid(LL a,LL b,LL &m,LL &n)

16 {

17     if(b == 0){

18         m = 1 ;

19         n = 0 ;

20         return  ;

21     }

22     exeulid(b,a%b,m,n) ;

23     LL t  = m ;

24     m = n ;

25     n = t-a/b*n ;

26 }

27 

28 int main()

29 {

30     LL x,y,l,a = 0,b,c,r,m,n,j1 = 0,j2= 0 ,t;

31     while(~scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&l))

32     {

33         a = n-m ;

34         b = l ;

35         c = x-y ;

36         r = gcd(a,b) ;

37         if(c % r){

38             printf("Impossible\n") ;

39             continue ;

40         }

41         a /= r ;

42         b /= r ;

43         c /= r ;

44         exeulid(a,b,j1,j2) ;

45         t = c*j1/b ;

46         j1 = c*j1-t*b ;

47         if(j1 < 0)

48             if(b > 0)

49             j1 += b ;

50     printf("%lld\n",j1) ;

51     }

52     return 0 ;

53 }
View Code

 

你可能感兴趣的:(poj)