重新整理了一下笔记
引入
一个数的逆元就是数论中,该数在模另一个数的意义下的倒数。
这么说或许太抽想了,我们可以看这个:
求组合数 $\Large{\left( ^a_b \right)}$ 取模 $10^9+7$ 的值。
这道题看上去简单,但是我们发现:
组合数是有乘有除的,而我们一般都是先乘完所有的再一个个除,这时就会出事了:
就比如 $\Large{\left( ^{20}_{10} \right)}$,我们可以看出答案是 $\Large{\frac{20!}{10!(20-10)!}}$
首先 $20!$ 肯定超过了 $10^9+7$,因此答案是取模过的。
但是,还有两个 $10!$ 还没有乘上去,可是取模过的数无法直接做除法运算了。
这可怎么办呢?就靠逆元了。
逆元的产生
以模数为 $11$ 为例:
$3*7=21,21 ≡ 10 (\text{mod } 11)$
我们尝试着将 $10$ 乘上一个数,使得它取模 $11$ 还原成 $3.$(实现理论除以 $7$ 的运算)
不难解出答案为 $8.$
那么,$8$ 就是 $7$ 在模 $11$ 意义下的逆元。
因此,在答案模 $11$ 的意义下,实现数除以 $7$ 我们只需要将数乘 $8$ 再取模就可以了。
如何求逆元
① 最好想的:费马小定理求逆元
费马小定理,当 $a$ 与 $p$ 互质且 $p$ 是质数的时候,满足:
$$a^{p-1} ≡ 1 (\text{mod }p)$$
那么,$a^{p-2}$ 就相当于少乘了一个 $a$,也就实现了除 $a$ 的运算。
而右边只有一个 $1$,于是在模 $p$ 意义下 $a$ 的逆元是 $a^{p-2}$,这个可以用快速幂求。
前提条件:$p$ 是质数。
但为什么 $a$ 可以与 $p$ 不互质呢?
因为不互质答案就是 $0$ ,虽然不满足费马小定理,但是可以求逆元,不影响结果。
例题:
题意:求有理数 $\frac{a}{b}$ 在模 $19260817$ 意义下的值,$0 \le a,b \le 10^{10001}.$
这道题的亮点就在于 $a,b$ 的规模,面对这种情况,我们一般使用快读处理:
一般的快读(无负数快读):
inline int read(){ int num = 0; char c = getchar(); while(c < '0' || c > '9') c = getchar(); while(c >= '0' && c <= '9'){ num = num * 10 + c - '0'; c = getchar(); } return num;}
在此基础上,我们加一些操作:
因为在模 $19260817$ 的意义下,$\Large{\frac{a}{b}=\frac{a\mod19260817}{b\mod19260817}}$ ,所以我们能在快读的过程中实现数字取模。
快读是一位一位拼上去的,那我们在拼的过程中就拼一次取模一次,就可以实现读入数并且取模了。
inline int read(){ int num = 0; char c = getchar(); while(c < '0' || c > '9') c = getchar(); while(c >= '0' && c <= '9'){ num = num * 10 % 19260817 + c - '0'; c = getchar(); } return num % 19260817;}
剩下的就好办了,在模 $19260817$ 的情况下,$b=0$ 意味无解,否则只需要将 $a$ 乘上 $b$ 的逆元在取模即可。
由于 $19260817$ 是质数,可以用费马小定理求。