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 }