逆元
前言:
依旧,和动态规划一样,逆元这个问题一直困扰了我很久,很烦人。
逆元属于数学问题,要和费马以及欧几里得扯上关系,第一次学习的时候就不是特别懂,造成了很大的问题,遇到有些题目特别是求期望等数学问题最后通常要求 mod 998244353,其实,整数还好,没啥问题,一遇到小数的模运算,就需要用到逆元的知识,这长期影响我连暴力都打不出来的尴尬局面。
逆元定义(Inverse)
就为了打一个逆元符号,刚刚跑去总结了一张常用关系符,哭死
如果 \(ax \equiv 1 (mod\ p)\) 我们就称 \(x\) 为 \(a\) 在模 \(p\) 意义下的乘法的逆
作用和意义是什么?目前唯一作用就是求小数模数的时候把除以一个数改成乘这个数的逆元。至于深层含义,我也没搞太懂。
介绍三种求逆元的方法:
1. 扩展欧几里得算法
简单来说就是逆向欧几里得,
\[ax+yp = 1
\]
然后两边同时除一个 \(p\)
\[as=1
\]
此时 \(s\) 即为 \(a\) 的逆元
2. 费马小定理
费马小定理:若 \(p\) 为质数,则有 \(a^{p-1} \equiv 1 (\mod p)\)
推理: \(a^{p-2} \times a \equiv 1(\mod p)\) ,即 \(a^{p-2}\) 就是 \(a\) 在模 \(p\) 意义下的逆元。
3. 递推法
然后设 \(p=k \times a+r,(r<a)\) 则 \(k\) 是 \(p/a\) 的商,\(r\) 是余数 。
\(k \times a+r≡0(\mod p)\)
\(k \times r^{−1}+a^{−1}≡0(\mod p)\)
\(a^{−1}≡−k∗r^{−1}(\mod p)\)
\(a^{−1}≡−⌊p/a⌋∗(p\%a)^{−1}(\mod p)\)
代码:
inv[1] = 1;
for(int i = 2; i < p; ++ i)
inv[i] = (p - p / i) * inv[p % i] % p;
花了我一个上午,代码还没打,溜了,溜了。