乘法逆元

重新整理了一下笔记

引入


一个数的逆元就是数论中,该数在模另一个数的意义下的倒数。

这么说或许太抽想了,我们可以看这个:

求组合数 $\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$ ,虽然不满足费马小定理,但是可以求逆元,不影响结果。

例题:$\text{luogu P2613 有理数取余}$

题意:求有理数 $\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$ 是质数,可以用费马小定理求。

转载于:https://www.cnblogs.com/zengpeichen/p/11391831.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值