一.啥是逆元
若整数 b , p b,p b,p互质,且 b ∣ a b\mid a b∣a,则存在一个整数 x x x,使得 a b ≡ a × x ( m o d p ) \dfrac{a}{b}\equiv a\times x\pmod{p} ba≡a×x(modp)。称 x x x为 b b b的模 p p p乘法逆元,记为 b − 1 ( m o d p ) b^{-1}\pmod{p} b−1(modp)
能不能整点人能看懂的
人能看懂的来了
若 b x ≡ 1 ( m o d p ) bx\equiv1\pmod{p} bx≡1(modp),称 x x x为 b b b模 p p p的乘法逆元。前提是 x , p x,p x,p互质,否则无解。
二.逆元砸球
1.费马小定理
若 p p p为质数,且 gcd ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1,那么
a − 1 ≡ 1 ( m o d p ) a^{-1}\equiv1\pmod{p} a−1≡1(modp)
读者自证不难
∵
a
−
1
≡
1
(
m
o
d
p
)
\because a^{-1}\equiv1\pmod{p}
∵a−1≡1(modp)
∴
a
×
a
−
2
≡
1
(
m
o
d
p
)
\therefore a\times a^{-2}\equiv1\pmod{p}
∴a×a−2≡1(modp)
故 a − 2 a^{-2} a−2是 a a a在模 p p p意义下的乘法逆元,所以就可以用快速幂求解
2.扩欧(不知道啥时扩欧的点这里)
这就是扩欧模板了吧。。。
b x ≡ 1 ( m o d p ) bx\equiv1\pmod{p} bx≡1(modp)
等价于方程
b x − p y = 1 bx-py=1 bx−py=1
直接上模板好吧。
3.线性递推
用于求一连串数字的逆元。P3811
首先有: 1 − 1 ≡ 1 ( m o d p ) 1^{-1}\equiv1\pmod{p} 1−1≡1(modp)
不妨设 p = k × i + r ( 1 < r < i < p ) p=k\times i + r(1 < r < i < p) p=k×i+r(1<r<i<p)
则有
k × i + r ≡ 0 ( m o d p ) k \times i + r \equiv0\pmod{p} k×i+r≡0(modp)
∴ k × r − 1 + i − 1 ≡ 0 ( m o d p ) \therefore k\times r^{-1} + i^{-1}\equiv0\pmod{p} ∴k×r−1+i−1≡0(modp)
∴ i − 1 ≡ − k × r − 1 ( m o d p ) \therefore i^{-1}\equiv-k\times r^{-1}\pmod{p} ∴i−1≡−k×r−1(modp)
∴ i − 1 ≡ − ⌊ p i ⌋ × ( p m o d i ) − 1 ( m o d p ) \therefore i^{-1}\equiv -\left\lfloor\dfrac{p}{i}\right\rfloor \times (p \mod i)^{-1}\pmod{p} ∴i−1≡−⌊ip⌋×(pmodi)−1(modp)
然后就可以线性时间求出逆元了
inv[1] = 1;
for(int i = 2; i < p; ++ i)
inv[i] = (p - p / i) * inv[p % i] % p;