从快速幂到乘法逆元到组合数

一、快速幂

int quickpow(int a,int n)
{
int ans = 1;
while(n)
{
if(n&1)
ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}

通过底数不断平方,指数不断进行位运算>>1,最后变成ans1,达到节省复杂度的效果。

二、乘法逆元

这里就不得要提每个人刚学数论都要遇到的费马小定理了。
在这里插入图片描述
将左边变成ap-2*a,显然,ap-2就是a的逆元了。

注意:涉及除法取模运算的时候,(A/B)mod C,直接(A mod C)/ (B mod C)是错误的;应该要先将B转换成其逆元b=1/B,之后求出(A*b)modC即可;

三、加上组合数的运用

在这里插入图片描述
上代码

int fac[MAXN];	
int c(int n,int m){
    fac[0] = 1;
    for(int i=1;i<=n;i++) fac[i] = fac[i-1] * i % mod;  //注意不能少mod
        return fac[n] * quickpow(fac[m],mod-2) % mod * quickpow(fac[n-m],mod-2) % mod;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值