组合数板板

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;
}
posted @ 2024-08-26 10:26  whrwlx  阅读(3)  评论(0编辑  收藏  举报