BZOJ 2982: combination Lucas模板题

Code:

#include<bits/stdc++.h>
#define ll long long 
#define maxn 1000003 
using namespace std;
const ll mod = 10007; 
void setIO(string s)
{
	string in=s+".in"; 
	freopen(in.c_str(),"r",stdin); 
}
struct Comb
{
	ll fac[maxn]; 
	ll qpow(ll base,ll k)
	{
		ll tmp=1;
		while(k)
		{
			if(k&1)tmp=tmp*base%mod; 
			k>>=1; 
			base=base*base%mod; 
		}
		return tmp; 
	}
	void init()
	{
		int i;
		fac[1]=fac[0]=1; 
		for(i=2;i<maxn;++i) fac[i]=(fac[i-1]*i)%mod; 
	}
    ll getinv(ll a)
    {
    	return qpow(a,mod-2); 
    }
    ll C(ll n,ll m)
    {
    	if(m==0) return 1; 
    	if(n<m) return 0; 
    	return (fac[n]*getinv(fac[n-m]*fac[m]))%mod;   
    }
    ll lucas(ll n,ll m)
    {
    	if(m==0) return 1;
    	return (lucas(n/mod,m/mod)*C(n%mod,m%mod))%mod; 
    }
}t;  
int main()
{
	// setIO("input"); 
	int T,n,m; 
	scanf("%d",&T); 
	t.init(); 
	while(T--)
	{
		scanf("%d%d",&n,&m);
		if(n<m) swap(n,m); 
		printf("%lld\n",t.lucas(n,m)); 
	}
	return 0; 
}

  

posted @ 2019-06-26 13:40  EM-LGH  阅读(130)  评论(0编辑  收藏  举报