C++逆元详解

2019-04-14 09:02发布

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
(ab)%m=(a%mb%m)%m" role="presentation">(ab)%m=(a%mb%m)%m
(a×b)%m=(a%m×b%m)%m" role="presentation">(a×b)%m=(a%m×b%m)%m
(模运算为最高级运算,负数不考虑= =)
但是有除法怎么办?显然ab%ma%mb%m" role="presentation">ab%ma%mb%m,需要用逆元将其变为乘法,然后使用分配率。

逆元

概念

ab1 (mod m)" role="presentation">ab1 (mod m),则称a" role="presentation">ab" role="presentation">b在模m" role="presentation">m的情况下互为逆元。
b=a1" role="presentation">b=a1,所以b" role="presentation">b又叫a" role="presentation">a的数论倒数。

求逆元

需要用到费马小定理:若p" role="presentation">p为质数(显然a" role="presentation">ap" role="presentation">p互质),则ap11 (mod p)" role="presentation">ap11 (mod p),所以ap2" role="presentation">ap2就是a" role="presentation">a在模p" role="presentation">p的情况下的一个逆元,由模乘法的分配率得ap2%m" role="presentation">ap2%m也是a" role="presentation">a的一个逆元,用快速幂求得即可(一般题目中的模数都是质数)。

用法

c=b1" role="presentation">c=b1,则bc%m=1" role="presentation">bc%m=1m" role="presentation">m不可能为1" role="presentation">1),所以有:ab%m=ab1%m=ab×bc%m=ac%m=a·b1%m" role="presentation">ab%m=ab1%m=ab×bc%m=ac%m=a·b1%m
求出b" role="presentation">b的逆元就能处理模运算中的除法了。

例题

AtCoder - 1974·いろはちゃんとマス目 / Iroha and a Grid