求逆元的3种方法(数论)(同余)

1.线性求逆元

假设模数为p, p = i ⋅ k + r , k , r ∈ Z , 0 ≤ r < i p=i\cdot k+r,k,r\in \Z,0\leq r<i p=ik+r,k,rZ,0r<i

两边同时对p取mod得: 0 ≡ i ⋅ k + r ( m o d p ) 0\equiv i\cdot k+r\pmod p 0ik+r(modp)

两边同时乘 i − 1 ⋅ r − 1 i^{-1}\cdot r^{-1} i1r1,把 i − 1 i^{-1} i1分离出来 得: 0 ≡ k ⋅ r − 1 + i − 1 ( m o d p ) 0\equiv k\cdot r^{-1}+i^{-1}\pmod p 0kr1+i1(modp)

进而 i − 1 ≡ − k ⋅ r − 1 ( m o d p ) i^{-1}\equiv -k\cdot r^{-1}\pmod p i1kr1(modp)

回到 p = i ⋅ k + r p=i\cdot k+r p=ik+r, 可以推出 k = ⌊ p / i ⌋ , r − 1 = ( p % i ) − 1 k=\lfloor p/i \rfloor, r^{-1}=(p\%i)^{-1} k=p/i,r1=(p%i)1

代入即可: i − 1 ≡ − ⌊ p / i ⌋ ⋅ ( p % i ) − 1 ( m o d p ) i^{-1}\equiv -\lfloor p/i \rfloor\cdot (p\%i)^{-1}\pmod p i1p/i(p%i)1(modp)

写成代码一句话

inv[i]=-MOD/i*inv[MOD%i];
inv[i]=(MOD-MOD/i)*inv[MOD%i];//更好

预处理inv[0]=inv[1]=1就完工.

2.费马小定理求逆元

经典中的经典,如果 ( a , m ) = 1 (a,m)=1 (a,m)=1
a m ≡ a ( m o d m ) a − 1 = a m − 2 \begin{aligned} a^m &\equiv a\pmod m\\ a^{-1} &= a^{m-2} \end{aligned} ama1a(modm)=am2

3.exgcd求逆元

x = a − 1 x=a^{-1} x=a1
a x ≡ 1 ( m o d m ) ax \equiv 1 \pmod m ax1(modm)
等价于
a x + m y = 1 ax + my = 1 ax+my=1
这样一个exgcd能解决的问题。

实际情况下:

exgcd(a,p,x,y);
x=(x%m+m)%m;

其他小技巧

求阶乘逆元

注意乘的是 i + 1 i+1 i+1

fac[0]=1;for(int i=1;i<=N;i++) fac[i]=fac[i-1]*i%MOD;
ifac[N]=qmod(fac[N], MOD-2);
for(int i=N-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%MOD;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值