扩展欧几里得
扩展欧几里得算法
对于 \(a*x+b*y=m\), 可用 exgcd 求出 \(d=gcd(a,b)\)
-
\(d\nmid m\) ,无解
-
\(d\mid m\), 则 exgcd 可解出 \(a*x+b*y=d\) 的两个解 \(xx,yy\)
令 \(a'=\frac ad,\;b'=\frac bd,\;m'=\frac md\)
则 \(a*x+b*y=m\) 的两个解为 \(x_0=xx*m',\;y_0=yy*m'\)
特解为 \(x=x_0+t*b',\;y=y_0+t*a'\)
且 \(x_0,\;y_0\) 为最靠近 \(0\) 的一对解, 因此若 \(x_0<0\), 则令 \(x_0=x_0+b'\) 即可得到最小非负整数解
模板
ll exgcd(ll a, ll b, ll &x, ll &y)
{
if (b == 0)
{
x = 1, y = 0;
return a;
}
ll xx, yy;
ll d = exgcd(b, a % b, xx, yy);
x = yy, y = xx - a / b * yy;
return d;
}