用途:
扩展欧几里得主要是用来求解形如 (ax+byequiv gcd(a,b)) 的方程((a),(b) 已知)的正整数解中x最小的一组。
下为推导:
令 (x=y_2,y=x_2-[a/b]y_2)
(a)(y_2)(+b)((x_2-[a/b]y_2))(=gcd(a,b))
(ay_2+b(x_2-[a/b]y_2)=gcd()(b,amod b)())
(bx_2)(+ay_2-)(b[a/b]y_2)(=gcd(b,amod b))
(bx_2+)((a-b[a/b])y_2)(=gcd(b,amod b))
(bx_2+)((amod b))(y_2=gcd(b,amod b))
这个方程就是把(ax+byequiv gcd(a,b))中的((a,b))变成了((b,amod b))而已。就这样,我们求出这个方程的(x_2)与(y_2),自然就能倒推原方程中的(x)与(y)了。这样一直迭代下去,(b)每次总会变为(amod b),也就是不断逼近(gcd(a,b))。而当(b=gcd(a,b))的时候,(amod b=0),这样(x_2=1)成为了一组通解(与(y_2)无关)。
void exgcd(ll a,ll b,ll& x,ll& y){
if(!b)return y=0,x=1,void();
exgcd(b,a%b,y,x);
y-=(a/b)*x;
}