POJ 1061
结题报告参考:http://hi.baidu.com/newmyl/item/dc6805253305833195f62b0a
#include <cstdio> #include <cstring> using std::memset; long long x,y,m,n,l; long long a,b,ansx,ansy, c, r; 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 r = exGcd(b, a%b, x, y); long long t = x; x = y; y = t - a / b * y; return r; } long long gcd(long long a,long long b) { return b?gcd(b,a%b):a; } int main() { scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y, &m, &n, &l); a = m - n; b = l; c = y - x; r = gcd(a,b); //首先要判断是否能够整除 if(c%r) { printf("Impossible\n"); } else { //然后将系数除以gcd(a,b); a /= r; b /= r; c /= r; //求解ax+by = 1 exGcd(a, b, ansx, ansy); //ax + by = c/r 的解为n*ansx, n*ansy; 全部解ansx = n*ansx + k*b, ansy = n*ansy - k*a long long t = c*ansx/b; ansx = c*ansx - t*b; if(ansx < 0) ansx += (b>0?b:-b); printf("%I64d\n", ansx); } }