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;
}