http://poj.org/problem?id=1061
(t*m + x) - (y + t*n) = k * L
t*(m-n) - k*L = y - x
由此使用扩展gcd来解不定方程!
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
LL exGcd(LL a, LL b, LL &x, LL &y){
if(b == 0){
x = 1;
y = 0;
return a;
}
LL gcd = exGcd(b, a%b, y, x);
y -= (a/b)*x;
return gcd;
}
int main(){
//freopen("in.txt", "r", stdin);
LL X, Y, m, n, L;
while(scanf("%lld%lld%lld%lld%lld",&X,&Y,&m,&n,&L) == 5){
LL a = m - n, b = -L, c = Y - X, x, y;
if(a == 0){///特判特殊情况
cout << "Impossible" << endl;
continue;
}
LL gcd = exGcd(a, b, x, y);
if(c % gcd){///无解情况
cout << "Impossible" << endl;
continue;
}
x *= (c/gcd);
if(b / gcd < 0) b = -b;
x %= b / gcd;
while(x < 0) x += b/gcd;///得到最小正整数解
cout << x << endl;
}
return 0;
}