兩青蛙同向跳,起點 x,y,步長 m,n,周長 L。求最小 t 使:
x + m*t ≡ y + n*t (mod L)
⇔ (m-n)t ≡ y-x (mod L)
設 a=m-n, b=L, c=y-x,求解 a t ≡ c (mod b)。
d = gcd(a,b)。若 c % d != 0 無解,輸出 "Impossible"。a p + b q = d,得特解 p0。t = p0 * (c/d) mod (b/d),取最小非負解。long long exgcd(long long a, long long b, long long &x, long long &y) {
if(b==0) { x=1; y=0; return a; }
long long d = exgcd(b, a%b, y, x);
y -= a/b * x;
return d;
}
int main() {
long long x,y,m,n,L;
while(cin>>x>>y>>m>>n>>L) {
long long a=m-n, b=L, c=y-x;
long long d = gcd(a,b);
if(c % d) { cout << "Impossible" << endl; continue; }
long long p,q; exgcd(a,b,p,q);
long long mod = b/d;
long long ans = (p * (c/d) % mod + mod) % mod;
cout << ans << endl;
}
}
gcd 取絕對值,exgcd 處理負數正確性mod 保證非負