扩展欧几里得(exgcd):
用途:求不定方程的解
根据裴蜀定理 可知:当 ax+by=c有解的充分必要条件为 gcd(a,b) | c
因此方程就转化为了 ax+by=gcd(a,b)
《快乐求解》:
1.令 x’ y’,满足
b
x
′
+
a
%
b
y
′
=
g
c
d
(
b
,
a
%
b
)
=
g
c
d
(
a
,
b
)
bx'+a\%by'=gcd(b,a\%b) =gcd(a,b)
bx′+a%by′=gcd(b,a%b)=gcd(a,b)
2.因此此式与原式右边相等,可得:
a
x
+
b
y
=
b
x
′
+
(
a
−
[
a
/
b
]
∗
b
)
y
′
ax+by=bx'+(a-[a/b]*b)y'
ax+by=bx′+(a−[a/b]∗b)y′
3.将右边移项得
a
x
+
b
y
=
a
y
′
+
b
(
x
′
−
[
a
/
b
]
y
)
ax+by=ay'+b(x'-[a/b]y)
ax+by=ay′+b(x′−[a/b]y)
解得
{
x
=
y
′
y
=
x
′
−
[
a
/
b
]
y
\left\{\begin{matrix}x=y'\\y=x'-[a/b]y\end{matrix}\right.
{x=y′y=x′−[a/b]y
当b = 0时,a就是这两个数的最大公约数,所以x = 1 , y = 0 时就满足等式。
当b ≠ 0 时就先算出当a = b , b = a m o d b时等式成立的x 和y ,显然新的a 和b 的最大公约数和原来是相同的。
当求 ax+by=c 时,我们只需要将答案都*(c/gcd(a,b))即可
Code
void exgcd(int a,int b,int &x,int &y,int &g){
if(b==0){
x=1,y=0;
}
else{
exgcd(b,a%b,g,x,y);
int k=x;
x=y;
y=k-(a/b)*y;
}
}