https://zhuanlan.zhihu.com/p/105467597在数论中,如果
,我们就说
和
在模
意义下互为乘法逆元,记作
。
逆元有什么用呢?我们常常遇到一些题目要求结果对一个大质数
取模,这是因为答案很大,出题人为了不麻烦大家写高精,就采取这样的方法。
加减法和
乘法对取模运算都是
封闭的,所以你可以处处取模来避免溢出。
但遇到除法时,就麻烦了:
为了解决模意义下的除法问题,我们引入了逆元。
其实可以看做模
意义下的
,那么在模
意义下,
就可以变形为
。
实际上在模
意义下
,所以上面的式子可以这样计算:
这里介绍三种计算逆元的方法:拓展欧几里得,费马小定理,线性递推。
拓展欧几里得
这种方法上一节已经介绍了,那道“同余方程”其实就是在求逆元。实际上,这就是最常用的求逆元的方法。代码如下:
ll
费马小定理
费马小定理是数论里的重要定理,叙述如下:
若是质数,且,则有
从逆元的定义推导,可得
,于是有
。
于是对
算一下
快速幂就好了。注意这个方法只对
是质数的情形有效。
inline
线性递推
以上两种方法都是常用的求逆元方法,但是,洛谷上的这道毒瘤模板题,必须要用特殊的方法:
(洛谷P3811 【模板】乘法逆元)
题目背景
这是一道模板题 题目描述
给定求中所有整数在模意义下的乘法逆元。输入格式
一行两个正整数。输出格式
输出行,第行表示在模下的乘法逆元。
因为这道题要求一系列的乘法逆元,而且数据范围是
,常规方法是行不通的。这里介绍逆元的
线性递推求法。
设
, 即
,
。
在模
意义下,有
。
移项整理得
。
则
即
其实和拓展欧几里得还是有不少相似之处的。我们可以用记忆化搜索的方法,减少多次查询的时间复杂度(空间换时间)。(递推亦可,其实就这题而言递推更好)
// 多次对不同的p使用需要清空Inv数组
Pecco:算法学习笔记(目录)zhuanlan.zhihu.com