填坑行动10-gcd以及exgcd
@
Tips
- 本文中所有
方程有解
均为方程有整数解
gcd
令\(\gcd\left(a,b\right)\)为\(a,b\)的最大公约数。
那么
\(\gcd(a,b)=\\
b,\ a\mod b=0\\
\gcd(b\mod a, b ),\ b\mod a \not= 0\)
或者是
\(\gcd(a,b)=\\
b,\ a=0\\
\gcd(b\mod a, b ),\ a \not= 0\)
算法复杂度\(\Theta\left(\log_2\max\left(a,b\right)\right)\)
exgcd
前置芝士
关于\(x,y\)的一个二元一次方程\(ax+by=c\)
当且仅当\(\gcd\left(a,b\right)|c\)时,方程有解。
这是裴蜀定理,证明因为不会所以就不讲了
exgcd求逆元
我们有一个方程关于\(x,y\)的一个二元一次方程\(ax+by=c\)
要使这个方程有解,则\(\gcd\left(a,b\right)|c\)。令\(c=k\gcd(a,b)\),那么设一个关于\(x_0,y_0\)的方程\(a_0x_0+b_0y_0=\gcd(a_0,b_0)\),那么\(x=kx_0,y=ky_0\)
设这个方程有一组解\(x,y\),就不难得出这组方程的通解:
\(x+k(b\div\gcd(a,b)),y-k(a\div\gcd(a,b))\)(\(k\)是整数)
只要求出一个解就可以求出所有解了。那么,我们怎么求助一组解呢?用exgcd(逆元)就可以了。
设这个二元一次方程是\(a_0x_0+b_0y_0=\gcd(a_0,b_0)\)然后通过一次exgcd后成为了\(a_1x_1+b_1y_1=\gcd(a_1,b_1)\),其中\(a_1=b_0\ ,\ b_1=b_0\mod a_0,\gcd(a_0,b_0)=\gcd(a_1,b_1)\)(其实就是进行一次\(\gcd\)辗转相除)
那么我们就可以得到
\(a_0x_0+b_0y_0=a_1x_1+b_1y_1\)
进而得到\(y_0=x_1,x_0=y_1-\lfloor b_0/a_0\rfloor\times x_1\)
当\(a_1=0\)的时候,令\(x_0=0,y_0=1\),这样就可以递归回溯了。