组合数板板
inline int modpow(int x,int y,int mod)//逆元
{
int re=1;x%=mod;
while(y)
{
if(y&1) re=re*x%mod;
x=x*x%mod,y>>=1;
}
return re%mod;
}
inline void preC(int nn,int mod)//PRE
{
fac[0]=inv[0]=1;
for(int i=1;i<=nn;i=-~i) fac[i]=fac[i-1]*i%mod;
inv[nn]=modpow(fac[nn],mod-2,mod);
for(int i=nn;i>=2;i=~-i) inv[i-1]=inv[i]*i%mod;
}
inline int C(int n,int m,int mod)//组合数
{
if(!m||n==m) return 1;if(n<m) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int modC(int n,int m,int mod)//卢卡斯
{
if(!m||n==m) return 1;if(n<m) return 0;
return C(n%mod,m%mod,mod)%mod*modC(n/mod,m/mod,mod)%mod;
}
\[or
\]
inline int modpow(int x,int y)
{
int re=1;x%=mod;
while(y)
{
if(y&1) re=re*x%mod;
x=x*x%mod,y>>=1;
}
return re%mod;
}
inline void preC(int nn)
{
fac[0]=inv[0]=1;
fd(i,1,nn) fac[i]=fac[i-1]*i%mod;
inv[nn]=modpow(fac[nn],mod-2);
bd(i,nn,2) inv[i-1]=inv[i]*i%mod;
}
inline int C(int n,int m)
{
if(!m||n==m) return 1;if(n<m) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int modC(int n,int m)
{
if(!m||n==m) return 1;if(n<m) return 0;
return C(n%mod,m%mod)%mod*modC(n/mod,m/mod)%mod;
}
本文来自博客园,作者:whrwlx,转载请注明原文链接:https://www.cnblogs.com/whrwlx/p/18380440