扩展欧几里得-Exgcd

用途:

  扩展欧几里得主要是用来求解形如 (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;
}
原文地址:https://www.cnblogs.com/xiong-6/p/11389930.html