简要理解
对于形如
a
x
+
b
y
=
c
ax+by=c
ax+by=c的这样一个二元一次不定方程,我们由裴蜀定理知道:
a
x
+
b
y
=
gcd
(
a
,
b
)
ax+by=\gcd(a,b)
ax+by=gcd(a,b),
gcd
(
a
,
b
)
\gcd(a,b)
gcd(a,b)为最小解
而后的每个解都是
gcd
(
a
,
b
)
\gcd(a,b)
gcd(a,b)的倍数
两个已知量
先有两已知量a,b,根据裴蜀定理我们有:
存在x,y满足
a
x
+
b
y
=
g
c
d
(
a
,
b
)
ax+by=gcd(a,b)
ax+by=gcd(a,b)
相关证明略,类似辗转相除
然后这个方程可以用扩展欧几里得去求解
这个式子我们变换一下:
gcd
(
a
,
b
)
=
b
y
+
(
a
%
b
+
b
∗
⌊
a
b
⌋
)
x
\gcd(a,b)=by+(a\%b+b*\lfloor\frac{a}{b}\rfloor)x
gcd(a,b)=by+(a%b+b∗⌊ba⌋)x
gcd
(
a
,
b
)
=
(
a
%
b
)
x
+
(
y
+
b
⌊
a
b
⌋
∗
x
)
b
\gcd(a,b)=(a\%b)x+(y+b\lfloor\frac{a}{b}\rfloor*x)b
gcd(a,b)=(a%b)x+(y+b⌊ba⌋∗x)b
贴个扩展欧几里得的代码
typedef long long ll;
ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
ll gcd = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
n个已知量
类似两个位置量,设n个未知量分别为
a
1
,
a
2
…
…
a
n
a_1,a_2……a_n
a1,a2……an,我们有:
存在
x
1
,
x
2
,
…
…
,
x
n
x_1,x_2,……,x_n
x1,x2,……,xn使
a
1
∗
x
1
+
a
2
∗
x
2
+
…
…
+
a
n
∗
x
n
=
gcd
(
a
1
,
…
…
,
a
n
)
a_1*x_1+a_2*x_2+……+a_n*x_n=\gcd(a_1,……,a_n)
a1∗x1+a2∗x2+……+an∗xn=gcd(a1,……,an)