扩展GCD

a*x+b*y=d,d=gcd(a,b).

模板代码:

void exgcd(int a,int b,int& d,LL &x,LL &y){
	if(b==0){
		d=a;
		x=1;y=0;
		return;
	}
	exgcd(b,a%b,d,y,x);
	y-=a/b*x;
}



-----取自小白
  • 算法推导及证明:

,当时,,此时,否则设

 

     

 

由于,所以进一步得到

 

     

 

所以得到

 

                   

证明过程来自 acdream的博客,orz。
详见算导(第二版)528;具体数学86。
  • 其它解:
a*x1+b*y1=a*x2+b*y2     ---->
a*(x1-x2)=b*(y2-y1)      ------>
a/d*(x1-x2)=b/d*(y2-y1)  --------------->
a/d,b/d互质 -------------->
x1-x2=k*(b/d),y2-y1=k*(a/d) --------------->
x=x0+b/d*k,y=y0-a/d*k,k为任意整数。
  • 性质:
  1. a*b!=0,|x|<=b且|y|<=a。
  • 与扩展GCD有关的算法:
  1. 中国剩余定理
  • 相关的题目:
  1. poj1061,2115。
  2. poj2142
  3. hoj2815
  4. uva10673

你可能感兴趣的:(数学)