欧几里得算法的拓展应用中有如下三条定理:
定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。
定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。
定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。
ac代码:
#include <iostream>
using namespace std;
long long t, p, c;
void extend_euild(int a, int b)
{
if(b == 0)
{
t = 1;
p = 0;
c = a;
}
else
{
extend_euild(b, a%b);
int temp = t;
t = p;
p = temp - a/b*p;
}
}
int main()
{
int i, j, ok = 0, d, a, b;
long long x, y, m, n, l;
freopen("in.txt", "r", stdin);
cin >> x >> y >> m >> n >> l;
if(n == m)
ok = 1;
else{
a = n-m;
d = x-y;
b = l;
extend_euild(a, b);
if(d % c !=0)
ok = 1;
}
if(ok)
cout << "Impossible" << endl;
else
{
b = b / c;
d = d / c;
long long v = d * t;
cout << (v%b+b)%b << endl;
}
getch();
return 0;
}