~~~题目链接~~~
思路:设青蛙要跳x次才相遇, 可得方程 (a+xm)%L = (b+xn)%L 推出 x(m-n) + yL = b-a. 根据扩展欧几里德算法可求出一组x(m-n) + yL = gcd(m-n, L)的一组解, 当(b-a)为gcd(m-n, L)的倍数时原方程才有整数解, 现在要求求最小的跳动次数x, 思想参考了ComeOn4MyDream的~~资料~~
求最小的跳动次数x, 简单的说来就是通过通解 X = X1+K*L/gcd(m-n, L), 来求第一回大于0的数, 这个数是以L/gcd(m-n, L)为单位增加的。
code:
#include <stdio.h> void gcd(__int64 a, __int64 b, __int64 &d, __int64 &x, __int64 &y) { if(!b) { d = a; x = 1; y = 0; } else { gcd(b, a%b, d, y, x); y -= x*(a/b); } } int main() { __int64 a = 0, b = 0, c = 0, d = 0, m = 0, n = 0, x = 0, y =0, L = 0, s1 = 0, s2 = 0, t = 0; while(scanf("%I64d %I64d %I64d %I64d %I64d", &s1, &s2, &m, &n, &L) != EOF) { a = m-n, b = L, c = s2-s1; if(a<0) a = -a, c = -c; gcd(a, b, d, x, y); if((c)%d) printf("Impossible\n"); else { x *= (c)/d; /* t = x/(b/d); x -= t*(b/d); if(x<0) x += b/d;*/ t = b/d; x = (x%t+t)%t; printf("%I64d\n", x); } } return 0; }