一、GCD
辗转相除法
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
gcd(a,b)=gcd(b,a
gcd(a,b)=gcd(b,a
m
o
d
mod
mod
b
)
b)
b)
二、裴蜀定理
裴蜀定理:方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)一定存在整数解
三、exGCD
- 作用:求形似ax+by=c的方程的整数解
- 由裴蜀定理, g c d ( a , b ) ∣ c gcd(a,b) | c gcd(a,b)∣c
- 所以只用求 a x + b y = g c d ( a , b ) 的 解 ax+by=gcd(a,b)的解 ax+by=gcd(a,b)的解在把解 ∗ c g c d ( a , b ) *\frac{c}{gcd(a,b)} ∗gcd(a,b)c
- 首先有方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
- 令
A
=
b
,
B
=
a
A=b,B=a
A=b,B=a
m
o
d
mod
mod
b
b
b
则有 A x ′ + B y ′ = g c d ( A , B ) = g c d ( a , b ) Ax'+By'=gcd(A,B)=gcd(a,b) Ax′+By′=gcd(A,B)=gcd(a,b) - 联立得 b x ′ + ( a bx'+ (a bx′+(a m o d mod mod b ) y ′ = a x + b y b)y'=ax+by b)y′=ax+by
- 又 a a a m o d mod mod b b b= a − [ a b ] ∗ b a-[\frac{a}{b}]*b a−[ba]∗b
- 代入式子,化简得 a y ′ + b ( x ′ − [ a b ] y ′ ) = a x + b y ay'+b(x'-[\frac{a}{b}]y')=ax+by ay′+b(x′−[ba]y′)=ax+by
- 则递归可求得解
- 边界: b = 0 时 , x = 1 , y = 0 b=0时,x=1,y=0 b=0时,x=1,y=0
四、例题
NOIp2012同余方程
a
x
≡
1
(
m
o
d
ax≡1(mod
ax≡1(mod
b
)
<
=
>
a
x
+
b
y
=
1
b) <=> ax+by=1
b)<=>ax+by=1
用
e
x
g
c
d
exgcd
exgcd求得
x
x
x一解,若
x
<
0
x<0
x<0,则一直
+
b
+b
+b直到大于0
Code:
#include <bits/stdc++.h>
using namespace std;
int x, y;
void exgcd(int a, int b){
if (!b){
x = 1, y = 0; return;
}
exgcd(b, a % b);
int tmp = x;
x = y, y = tmp - a / b * y;
}
int main(){
int a, b;
scanf("%d%d", &a, &b);
exgcd(a, b);
while (x < 0) x += b;
printf("%d\n", x);
return 0;
}