扩展欧几里得算法求的是方程 的解
原理:
设 a>b,当b==0时,,此时x=1,y=0,否则设
由于,所以进一步得到
所以得到
代码实现
void extend(LL a, LL b, LL, &x, LL &y )
{
if(b == 0) {
x = 1;
y = 0;
return ;
}
extend(b,a%b,x,y);
LL tmp = x;
x = y;
y = tmp - (a/b) * y;
}
例题一 POJ1601
#include <cstdio>
using namespace std;
#define LL long long
LL d;
LL gcd(LL a, LL b)
{
if(b == 0) return a;
return gcd(b,a%b);
}
void exged(LL a, LL b, LL &x, LL &y)
{
if(b == 0) {
x = 1; y = 0;
}
else {
exged(b,a%b,y,x);
y -= x*(a/b);
}
}
int main()
{
LL x, y, m, n, l;
while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)) {
LL a = n-m;
LL b = x-y;
LL X, Y;
d = gcd(a,l);
if(b%d != 0) {
puts("Impossible");
}
else {
a /= d;
l /= d;
b /= d;
exged(a,l,X,Y);
X *= b;
X %= l;
while(X < 0) X += l;
printf("%ld\n",X);
}
}
return 0;
}