bzoj2982

求组合数的板子
lucas相关

#include<cstdio>
#include<cctype>
inline void read(int &x){
	char ch=getchar();x=0;
	for(;!isdigit(ch);ch=getchar());
	for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
}
typedef long long ll;
const int mo=10007,N=1e5+9;
int T,fac[N],inv[N],n,m;
inline int ksm(int x,int k){
	int ans=1;
	for(;k;k>>=1,x=1ll*x*x%mo)if(k&1)ans=1ll*ans*x%mo;
	return ans;
}
inline int C(int x,int y){
	if(x<y)return 0;
	if(x<mo && y<mo)return 1ll*fac[x]*inv[y]%mo*inv[x-y]%mo;
	return 1ll*C(x%mo,y%mo)*C(x/mo,y/mo)%mo;
}
int main(){
	read(T);fac[0]=1;
	for(int i=1;i<mo;i++)fac[i]=1ll*fac[i-1]*i%mo;
	inv[mo-1]=ksm(fac[mo-1],mo-2);
	for(int i=mo-2;i>=0;i--)inv[i]=(inv[i+1]*(i+1))%mo;//a^(p-1)==1相当于消去了一个
	for(;T;T--){
		read(n),read(m),printf("%d
",C(n,m));
	} 
	return 0;
}
原文地址:https://www.cnblogs.com/MikuKnight/p/9874669.html