扩展欧几里得--EXGCD有两个用途:求乘法逆元、求二元一次方程。
如果a,b是不都为0的整数。
求解ax+by=d相当于ax+by=gcd(a, b)。
已知d = gcd(a, b) = gcd(b, a%b) = gcd(b, a mod b);
gcd(b, a%b) = gcd(b, a-(a/b)*b);
则ax+by = bx1 + (a%b)*y1
= bx1 + [a-(a/b)*b]*y1
=ay1 + b*[x1-(a/b)*y1]
所以:x = y1, y = x1 - (a/b)*y1
C++代码实现:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int EXGCD(int a, int b, int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
int d = EXGCD(b, a%b, y, x);
int temp = x;
x = y;
y = temp-(a/b)*y;
return d;
}
int main()
{
int a, b, x, y;
cin >> a >> b;
int d = EXGCD(a, b, x, y);
cout << d << endl;
return 0;
}