bzoj 2982 combination

LINK:combination

combination 是组合 联合的意思 引申义为组合数.

题意:n个人每天晚上选m个人 这m个人不能有重复 问有多少种方案。

显然不考虑顺序 那么答案为C(n,m).直接上卢卡斯定理即可。

主要是练习一下卢卡斯定理 C(n,m)%p=C(n/p,m/p)*C(n%p,m%p);

const int MAXN=10010;
int n,m,T,maxx;
int fac[MAXN],inv[MAXN];
inline int ksm(int b,int p){int cnt=1;while(p){if(p&1)cnt=cnt*b%mod;b=b*b%mod;p=p>>1;}return cnt;}
inline void prepare()
{
	fac[0]=1;
	rep(1,maxx,i)fac[i]=fac[i-1]*i%mod;
	inv[maxx]=ksm(fac[maxx],mod-2);
	fep(maxx-1,0,i)inv[i]=inv[i+1]*(i+1)%mod;
}
inline int C(int a,int b){if(b>a)return 0;return fac[a]*inv[b]%mod*inv[a-b]%mod;}
inline int Lucas(int a,int b)
{
	if(b>a)return 0;
	if(a<=maxx)return C(a,b);
	return Lucas(a/mod,b/mod)*Lucas(a%mod,b%mod)%mod;
}
int main()
{
	freopen("1.in","r",stdin);
	maxx=mod-1;get(T);prepare();
	while(T--)
	{
		get(n);get(m);
		put(Lucas(n,m));
	}
	return 0;
}
原文地址:https://www.cnblogs.com/chdy/p/12577494.html