class="markdown_views prism-atelier-sulphurpool-light">
引入
通常情况下,模运算有加法、乘法,减法的分配率,即:
(a+b)%m=(a%m+b%m)%m" role="presentation">(a+b)%m=(a%m+b%m)%m
(a−b)%m=(a%m−b%m)%m" role="presentation">(a−b)%m=(a%m−b%m)%m
(a×b)%m=(a%m×b%m)%m" role="presentation">(a×b)%m=(a%m×b%m)%m
(模运算为最高级运算,负数不考虑= =)
但是有除法怎么办?显然
ab%m≠a%mb%m" role="presentation">ab%m≠a%mb%m,需要用逆元将其变为乘法,然后使用分配率。
逆元
概念
若
ab≡1 (mod m)" role="presentation">ab≡1 (mod m),则称
a" role="presentation">a与
b" role="presentation">b在模
m" role="presentation">m的情况下互为逆元。
记
b=a−1" role="presentation">b=a−1,所以
b" role="presentation">b又叫
a" role="presentation">a的数论倒数。
求逆元
需要用到费马小定理:若
p" role="presentation">p为质数(显然
a" role="presentation">a与
p" role="presentation">p互质),则
ap−1≡1 (mod p)" role="presentation">ap−1≡1 (mod p),所以
ap−2" role="presentation">ap−2就是
a" role="presentation">a在模
p" role="presentation">p的情况下的一个逆元,由模乘法的分配率得
ap−2%m" role="presentation">ap−2%m也是
a" role="presentation">a的一个逆元,用快速幂求得即可(一般题目中的模数都是质数)。
用法
设
c=b−1" role="presentation">c=b−1,则
bc%m=1" role="presentation">bc%m=1(
m" role="presentation">m不可能为
1" role="presentation">1),所以有:
ab%m=ab∗1%m=ab×bc%m=ac%m=a·b−1%m" role="presentation">ab%m=ab∗1%m=ab×bc%m=ac%m=a⋅b−1%m
求出
b" role="presentation">b的逆元就能处理模运算中的除法了。
例题
AtCoder - 1974·いろはちゃんとマス目 / Iroha and a Grid