费马小定理
适用条件:
m
o
d
mod
mod是素数
整数
a
a
a,质数
p
p
p
如果
a
a
a
p
^{p}
p
−
a
- a
−a 是
p
p
p 的倍数,
a
p
≡
a
(
m
o
d
a^p ≡ a (mod
ap≡a(mod
p
)
p)
p)
如果
a
a
a 不是
p
p
p 的倍数,
a
a
a
p
−
1
^{p-1}
p−1
≡
1
(
m
o
d
≡ 1 (mod
≡1(mod
p
)
p)
p)
所以
a
a
a
p
−
2
^{p-2}
p−2 * a
≡
1
(
m
o
d
≡ 1 (mod
≡1(mod
p
)
p)
p)
所以
a
a
a
p
−
2
^{p-2}
p−2是
a
a
a 在模
p
p
p下的逆元
ll M(ll a) {return a%mod;}//取模
ll Pow(ll a,ll b = mod-2){ll c; while(b){if(b&1) c=M(c*a); b>>=1; a=M(a*a);} return c;}//快速幂
扩展欧几里得
适用条件:存在逆元,个数不多,
m
o
d
mod
mod很大
a
x
≡
1
(
m
o
d
p
)
ax≡1 (mod p)
ax≡1(modp)即
a
x
−
y
p
=
1
ax-yp=1
ax−yp=1.
把
y
y
y写成
+
+
+的形式就是
a
x
+
p
y
=
1
ax+py=1
ax+py=1
x
x
x 是
a
a
a 的模
p
p
p 乘法逆元,
y
y
y 是
b
b
b 的模
a
a
a 乘法逆元。
void exgcd(ll a,ll b,ll &d,ll &x,ll &y) {//扩展欧几里得算法
if(!b) { d = a; x = 1; y = 0; return;}
exgcd(b, a%b, d, y, x);
y -= x*(a/b);
}
ll inv(ll a, ll p) {//求a在p下的逆元,不存在逆元返回-1
ll d, x, y;
exgcd(a, p, d, x, y);
return d==1 ? (x+p)%p : -1;
}
递归法
ll inv(int i) {return i==1 ? 1 : (mod - mod/i) * inv(mod%i) % mod;}