扩展欧几里得算法
Concrete破百页纪念. 没啥好说的, 无情上公式.
\(gcd(0,n)=n\)
\(gcd(m,n)=gcd(n\ mod\ m, m)\)
\(ax+by=gcd(a,b)\)
\(If\ a=0, we\ have\ x=0,y=1\)
\(otherwise, let\ r=b\ mod\ a\)
\(i.e.\ \ \ \ r=b-a\lfloor b/a\rfloor\)
\(Then, rx+ay=gcd(r,a)=gcd(a,b)\)
\(a(y-\lfloor b/a\rfloor x)+bx=gcd(a,b)\)
\(\begin{cases}x:=y-\lfloor b/a\rfloor x,\\ y:=x\end{cases}\)
code:
//mx+ny=gcd(m,n)
inline int extend_Euclid(const int& m, const int& n, int& x, int& y) {
int gcd, t;
if (m == 0) { x = 0, y = 1; return n; }
gcd=extend_Euclid(n % m, m,x,y);
t = y;
y = x, x = t - n / m * y;
return gcd;
}