乘法逆元小总结

一、什么是乘法逆元:

在解决模数问题的时候,我们发现\frac{a}{b}%p \neq \frac{a%p}{b%p},也就是除法计算中的取模,不能像加减乘那样先取模再计算。所以要把除法转换成乘法,即找到一个数b^{-1},使得\frac{a}{b}%p = (a*b^{-1})%p,那么我们就可以转换成乘法的取模来处理。这个数b^{-1}就叫做 b 的 乘法逆元。


二、怎么求

1.费马小定理

对于任意质数p,有a^{p-1} \equiv 1(mod p)

又因为a*x \equiv 1(modp),其中x就是我们要求的乘法逆元。

转换一下就能知道,x\equiv a^{p-2} (modp),这就是这种求法的原理,那么我们用快速幂求出模p下的a^{p-2}即可。

int fpm(int x,int pow,int mod){ //费马小定理
    //求x在mod意义下的逆元(其实是计算mod下x^pow,其中pow=p-2)
    x %= mod;
    int ans = 1;
    for(; pow; pow>>=1, x=x*x%mod)
        if(pow&1) ans=ans*x%mod;
    return ans;
}

2.阶乘逆元(求1!, 2!, 3! ......n!的逆元)

inline void init(){
    fac[0]=fac[1]=1; //初始化0!和1!
    for(int i=2;i<=N;i++)fac[i]=fac[i-1]*i%mod; //递推计算n!
    inv[N]=Pow(fac[N],mod-2); //fpm单独求出inv[N]
    for(int i=N-1;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod; //后面的根据inv[N]进行递推
}

3.线性递推(用于求一串连续数字的乘法逆元)

inv[1] = 1;
for(int i = 2; i<=n; ++ i)
    inv[i] = (mod - mod / i) * inv[mod % i] % mod;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值