扩展欧几里得

扩展欧几里得算法

对于 \(a*x+b*y=m\), 可用 exgcd 求出 \(d=gcd(a,b)\)

  1. \(d\nmid m\) ,无解

  2. \(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;
}
posted @ 2022-05-19 19:56  hzy0227  阅读(13)  评论(0编辑  收藏  举报