扩展欧几里得
前言
扩展欧几里得是用来求不定方程如:\(ax+by=c\)的一组特解.其中\(a,b,c\)为已知整数,\(gcd(a,b)|c\).这样,不
定方程才有解.
讲解
我们可以将问题转化为求\(ax+by=gcd(a,b)\),最后\(x,y\)同乘\(c/gcd(a,b)\)即可得到一个解
根据辗转相除法,我们直接推一波式子
\[ax+by=gcd(a,b)=gcd(b,a\%b)=bx'+(a\%b)y'=bx'+(a-a/b*b)y'
\]
我们将\(a,b\)看成变量,就可以得到:
\[\begin{cases}
x=y'\\
y=x'-a/b*x
\end{cases}\]
于是可以递归求解
当到递归底层,即\(b=0\)时,此时的\(a\)即为最初的\(gcd(a,b)\),所以此时\(x=1,y=0\)
当然我们在写法上可以稍微改一改,使代码更短
代码
void exgcd(int a,int b,int &d,int &x,int &y)
{
if(!b) d = a,x = 1,y = 0;
else
{
exgcd(b,a%b,d,y,x);
y -= a/b*x;
}
}