求 a x 1 + b y 1 = gcd ( a , b ) ax_1+by_1=\gcd(a,b) ax1+by1=gcd(a,b)
设 b x 2 + ( a m o d b ) y 2 = gcd ( b , a m o d b ) bx_2+(a\bmod b)y_2=\gcd(b,a \bmod b) bx2+(amodb)y2=gcd(b,amodb)
∴ gcd ( a , b ) = gcd ( b , a m o d b ) \therefore \gcd(a,b)=\gcd(b,a \bmod b) ∴gcd(a,b)=gcd(b,amodb)
∵ a x 1 + b y 1 = b x 2 + ( a m o d b ) y 2 \because ax_1+by_1=bx_2+(a\bmod b)y_2 ∵ax1+by1=bx2+(amodb)y2
又 ∴ a m o d b = a − ⌊ a b ⌋ × b \therefore a \bmod b=a-\lfloor\frac{a}{b}\rfloor\times b ∴amodb=a−⌊ba⌋×b
∵ a x 1 + b y 1 = b x 2 + ( a − ⌊ a b ⌋ × b ) y 2 \because ax_1+by_1=bx_2+(a-\lfloor\frac{a}{b}\rfloor\times b)y_2 ∵ax1+by1=bx2+(a−⌊ba⌋×b)y2
我们利用乘法分配律,把这个式子展开
b x 2 + ( a − ⌊ a b ⌋ × b ) y 2 = b x 2 + a y 2 − ⌊ a b ⌋ × b y 2 bx_2+(a-\lfloor\frac{a}{b}\rfloor\times b)y_2=bx_2+ay_2-\lfloor\frac{a}{b}\rfloor\times by_2 bx2+(a−⌊ba⌋×b)y2=bx2+ay2−⌊ba⌋×by2
然后,我们把 b b b 提出来
b x 2 + a y 2 − ⌊ a b ⌋ × b y 2 = a y 2 − b ( x 2 − ⌊ a b ⌋ × y 2 ) bx_2+ay_2-\lfloor\frac{a}{b}\rfloor\times by_2=ay_2-b(x_2-\lfloor\frac{a}{b}\rfloor \times y_2) bx2+ay2−⌊ba⌋×by2=ay2−b(x2−⌊ba⌋×y2)
然后,我们发现 x 1 = y 2 , y 1 = x 2 − ⌊ a b ⌋ × y 2 x_1=y_2,y_1=x_2-\lfloor\frac{a}{b}\rfloor \times y_2 x1=y2,y1=x2−⌊ba⌋×y2
这样,代码就好写了。
int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1;
y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return d;
}