题目链接:http://poj.org/problem?id=1061
一个结论(摘自紫皮书):
设a, b, c为任意整数。
若方程ax + by = c 的一组整数解为(x0,y0),则它的任意整数解都可以写成(x0+kb', y0-ka')
其中a' = a/gcd(a, b); b' = b/gcd(a, b);k取任意整数
设d = gcd(a, b)
对当前方程ax +by = d而言
下一步:by1 + (a - kb)x1 = d
即 ax1 + b(y1 - kx1) = d
则 y = y1 - kx1
扩展欧几里得算法:
void gcd(long long a, long long b, long long &d, long long &x, long long &y)
{
if(!b)
{
d = a;
x = 1;
y = 0;
}
else
{
gcd(b, a%b, d, y, x);
y -= x*(a/b);
}
}
题目代码:
#include<iostream>
#include<cstdio>
using namespace std;
void gcd(long long a, long long b, long long &d, long long &x, long long &y)
{
if(!b)
{
d = a;
x = 1;
y = 0;
}
else
{
gcd(b, a%b, d, y, x);
y -= x*(a/b);
}
}
int main()
{
long long x, y, m, n, l, k, t;
while(scanf("%lld %lld %lld %lld %lld", &x, &y, &m, &n, &l) != EOF)
{
long long ans = n-m;
long long a = n-m;
gcd(a, l, ans, t, k);
a /= ans;
l /= ans;
if((x-y) % ans == 0)
{
long long z = (x-y)/ans;
t = ((z*t)%l + l)%l;
if(t == 0)
t += l;
}
else
{
cout<<"Impossible"<<endl;
continue;
}
cout<<t<<endl;
}
return 0;
}