单独的考逆元,现在已经不多了
但是掌握很有必要
逆元是什么
当题目中最终答案太大时,往往会要求我们模一个数。这样的题往往是dpdp、递推之类。所以我们要步步取模。但如果某一步中出现了除法,或者一道概率dpdp 要求答案取模,这时就要涉及到模意义下的除法。
例如:a/b%m.这时我们将式子变形得到 a×1bmodma×1bmodm这样就得到了一个乘法。
设c是逆元,得b−1≡c(modm)b−1≡c(modm)
得b×c≡1(modm)b×c≡1(modm)
怎么求单个的逆元
显然可以用exgcdexgcd解这个方程。
b×c+m×k=1b×c+m×k=1
求得最小的一个cc即可。
还有,注意到了这个方程是不一定有解的,意思就是说不一定有逆元。但注意到为质数一定有解。这为接下来的线性求逆元提了个醒:只有质数才能线性求逆元。
另外一种做法,是使用欧拉定理。
有欧拉定理有:
aϕ(p)≡1aϕ(p)≡1
所以逆元可求为bϕ(m)−1bϕ(m)−1
注意到这个不能判断是否有逆元,使用时要注意。然后具体操作时,只需打一个快速幂就可以了。(一般模的是质数,所以ϕ(p)=p−1ϕ(p)=p−1);
怎么线性求逆元
逆元有一种线性求法,就是在O(n)O(n)内求1~n的逆元。
具体推理与操作过程如下;
p=k×i+rp=k×i+r
p≡0(modp)p≡0(modp)
k×i+r≡0(modp)k×i+r≡0(modp)
为了强行构造逆元,我们同乘i−1×r−1i−1×r−1
k×r−1+i−1≡0(modp)k×r−1+i−1≡0(modp)
i−1≡−k×r−1(modp)i−1≡−k×r−1(modp)
i−1≡−[pi]×(pmodi)−1(modp)i−1≡−[pi]×(pmodi)−1(modp)
实际操作中仍有以下两点需要注意
- 注意到右边是一个负数,实际中要加p再去模。
- 注意到这里只能求比p小的逆元,实际上比p大的模一个p就可以了。
代码
会后续补充…….