拓展欧几里得算法
先贴个模板: 1 void gcd(LL a,LL b,LL &d,LL &x,LL &y) 2 { 3 if (!b) 4 { 5 x=1; 6 y=0; 7 d=a; 8 } 9 else 10 { 11 gcd(b,a%b,d,y,x); 12 y-=a/b*x; 13 } 14 } 下面给出我对这个算法的理解: 现在要解ax+by=gcd(a,b) 假设我们已经解出了 bx 0 + (a%b)y 0 =gcd(a,b) (1) 令y=x 0 -> ay 0 + by = gcd(a,b) (2) (2)-(1)得到 (a-a%b)y 0 + b(y-x 0 )=0 整理得到 y=x 0 -((a-a%b)/b)y 0 = x 0 - a/b*y 0 = x 0 - a/b * x 根据上面的递归,返回的时候x=y0,y=x0 所以y需要再减去 a/b*x 函数结束时就可以得到一组解了。那么如何得到其他解呢? 首先令 d=gcd(a,b) a'=a/d b'=b/d ax+by=d 设a(x+x 0 ) + b(y+y 0 )=d 那么相减得到 ax 0 +by 0 =0 -> y 0 =-a/b * x 0 = -a'/b' * x 0 y 0 和x 0 都是整数,所以x 0 必定是b'的倍数. 即x 0 =k*b' 因此对于方程ax+by=d , 让x=x+b' y=y