1.贝祖定理
满足方程 a x + b y = c ax+by=c ax+by=c 有解的充分必要条件是 g c d ( a , b ) ∣ c gcd(a,b) | c gcd(a,b)∣c
2.欧几里得定理
用辗转相除求a,b的最大公因数
ll gcd(ll a,ll b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
3.扩展欧几里得定理
扩展欧几里得定理目的是解不定方程
根据题意写出同余方程
a
x
≡
c
(
m
o
d
b
)
ax ≡ c(mod \,b)
ax≡c(modb)
根据同余方程写出不定方程
a
x
+
b
y
=
c
ax+by=c
ax+by=c
用来求方程
a
x
+
b
y
=
g
c
d
(
a
,
b
)
ax+by=gcd(a,b)
ax+by=gcd(a,b) 的特解
进而求出
a
x
+
b
y
=
c
ax+by=c
ax+by=c 的通解
特解
x
0
,
y
0
x_0,y_0
x0,y0
通解
x
=
x
0
∗
c
g
c
d
(
a
,
b
)
+
k
∗
b
g
c
d
(
a
,
b
)
x=x_0*{c\over gcd(a,b)}+{k*b\over gcd(a,b)}
x=x0∗gcd(a,b)c+gcd(a,b)k∗b
y
=
y
0
∗
c
g
c
d
(
a
,
b
)
−
k
∗
a
g
c
d
(
a
,
b
)
y=y_0*{c\over gcd(a,b)}-{k*a\over gcd(a,b)}
y=y0∗gcd(a,b)c−gcd(a,b)k∗a
k
∈
Z
k\in Z
k∈Z
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
ll g = exgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}
这里返回值仍然是 g c d ( a , b ) gcd(a,b) gcd(a,b) ,在过程中,特解被存储在 x,y 之中根据题意求出所需的解
扩展欧几里得解题一般思路
1.根据题意写出同余方程
a
x
≡
c
(
m
o
d
b
)
ax ≡ c(mod \,b)
ax≡c(modb)
2.根据同余方程列出式子
a
x
+
b
y
=
c
ax+by=c
ax+by=c
带入扩展欧几里得求解
3.求最小整数解
x
=
(
x
%
b
+
b
)
%
b
x=(x\%b+b)\%b
x=(x%b+b)%b(这里
x
与
b
x与b
x与b 都是处理过的)
要保证b是正数
扩展欧几里得的难点在于找出同余方程并转化为不定方程
例题
1.P1082 [NOIP2012 提高组] 同余方程
(扩欧板子,求最小整数解)
同余方程题解
2.C Looooops 牛客
(扩欧板子,求最小整数解)
C Looooops 题解
3.Euclid Problem 牛客
(扩欧板子,求最小整数解)
4.青蛙的约会 牛客
(扩欧板子,求最小整数解)
青蛙约会题解
5.Disgruntled Judge 牛客
(扩欧进阶,找不定方程,枚举未知数)
Disgruntled Judge 题解