【数学】乘法逆元进阶

乘法逆元基础

可以使用扩展欧几里得算法费马小定理求得。

乘法逆元进阶

有一种乘法逆元的线性递推算法:
显然 1 − 1 ≡ 1 ( m o d m ) 1^{-1} \equiv 1 \pmod m 111(modm)
对于 i − 1 i^{-1} i1,我们令
k = ⌊ m i ⌋ k = \lfloor \frac{m}{i} \rfloor k=im j = m   m o d   i j = m\bmod i j=mmodi,有 m = k i + j m= ki + j m=ki+j,即 k i + j ≡ 0 ( m o d m ) ki+j \equiv 0 \pmod m ki+j0(modm)
两边同时乘 i − 1 × j − 1 i^{-1} \times j^{-1} i1×j1 得: k j − 1 + i − 1 ≡ 0 ( m o d m ) kj^{-1}+i^{-1} \equiv 0 \pmod m kj1+i10(modm)
i − 1 ≡ − k j − 1 ( m o d m ) i^{-1} \equiv -kj^{-1} \pmod m i1kj1(modm)
代入 m = k i + j m= ki + j m=ki+j 得:

i − 1 ≡ − ⌊ m i ⌋ ( m   m o d   i ) − 1 ( m o d m ) i^{-1} \equiv -\lfloor\frac{m}{i}\rfloor (m \bmod i)^{-1} \pmod m i1im(mmodi)1(modm)
故利用迭代易知。

还有一个求 i ! − 1 i!^{-1} i!1 时的小技巧如下:
假设我们要求 i ∈ [ 1 , N ] i\in[1,N] i[1,N] i ! i! i! 在模 m m m 意义下的逆元。
不妨先使用费马小定理求出 N ! − 1 N!^{-1} N!1
接着我们发现 i ! − 1 ⋅ i ≡ ( i − 1 ) − 1 i!^{-1}\cdot i\equiv (i-1)^{-1} i!1i(i1)1
故可以简单地线性递推。

代码

  • i − 1 i^{-1} i1
inv[1]=1;
for (int i=2;i<=n;i++) inv[i]=(long long)(M-M/i)*inv[M%i]%M;
  • i ! − 1 i!^{-1} i!1
fac[0]=1;
for (int i=1;i<=n;i++) fac[i]=fac[i-1]*i%M;
inv[n]=pow(fac[n],M-2);
for (int i=K-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%M;
  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值