ax≡1(mod b)
其中a,b是互逆的,则可以使用扩展欧几里得算法来求x
a * x1 + b * y1 = gcb(a, b) ......1
b * x2 + a % b * y2 = gcb(b, a % b) ......2
b * x2 + (a - a / b * b) * y2 = gcb(b, a % b) ......3
联立1 3得
a * x1 + b * y1 = a * y2 + b * (x2 - a / b * y2)
由待定系数法可得
x1 = y2, y1 = x2 - a / b * y2
由于ax + by = gcb(a, b),迭代到b = 0则a可设
x1 = 1, y1 = 0
#include <iostream>
using namespace std;
/**
* @brief 扩展欧几里得算法求逆
*/
void exgcd(long long a, long b, long long &x, long long &y)
{
long long tmp;
if(b == 0)
{
x = 1;
y = 0;
return;
}
exgcd(b, a % b, x, y);
tmp = y;
y = x - a / b * y;
x = tmp;
}
记得将x转换为最小正整数,(x%b+b)%b