首页 > 其他分享 >组合数模板

组合数模板

时间:2022-12-03 11:33:55浏览次数:42  
标签:infact 组合 int ll 逆元 ans 模板 mod

逆元

  • 定义: 当x * y≡1(mod p),y就是x在mod p下的逆元

  • 应用: a/b≡a * x(mod p),x就是a的乘法逆元
    我们可以将a/b≡a * x(mod p)这个式子化简,两边同乘b-->a≡a * b * x(mod p)-->b * x≡1(mod p)
    又有费马小定理可知,b^(n-1)≡1(mod p),所以x为b(p-2),所以逆元就是b(p-2)

快速幂求逆元

就是根据b^(p-2)这个公式

int qsm(int x,int y){
  int res=1;
  while(y){
    if(y&1) res=(res*x)%p;
    y>>=1;
    x=(x*x)%p;
  }
  return res;
}

cout<<qsm(b,p-2);

组合数模板

ll qsm(ll x,ll y,ll p){
  ll ans=1;
  while(y){
    if(y&1) ans=(ans*x)%p;
    y>>=1;
    x=(x*x)%p;
  }
  return ans;
}
void init(){
  fact[0]=infact[0]=1;
  for(ll i=1;i<N;i++){
     fact[i]=fact[i-1]*i%mod;
     infact[i]=infact[i-1]*qsm(i,mod-2,mod)%mod;
  }
}
/*void init(){//两种写法,区别在于infact的求法,一个是每一次跑一遍快速幂,一个是智跑一次然后倒着跑,建议第二种
    fact[0]=1;
    for(ll i=1;i<N;i++) fact[i]=fact[i-1]*i%mod;
    infact[N-1]=qsm(fact[N-1],mod-2)%mod;
    for(ll i=N-1;i>=1;i--) infact[i-1]=infact[i]*i%mod;
    
}*/
ll solve(ll x,ll y){
  return fact[x]*infact[y]%mod*infact[x-y]%mod;
}

标签:infact,组合,int,ll,逆元,ans,模板,mod
From: https://www.cnblogs.com/hhzp/p/16947218.html

相关文章