2982: combination|lucas定理

卢卡斯定理裸题

忘输出回车wa了两发

#include<bits/stdc++.h>
#define M 10007
using namespace std;
int fac[10086],inv[10086];
int cal(int x)
{
	int y=M-2,ans=1;
	while(y)
	{
		if(y&1)ans=ans*x%M;
		x=x*x%M;
		y>>=1;
	}
	return ans;
}
void pre()
{
	fac[0]=1; for(int i=1;i<10007;i++) fac[i]=fac[i-1]*i%M;
	inv[0]=1; for(int i=1;i<10007;i++) inv[i]=inv[i-1]*cal(i)%M;
}	
int C(int n,int m)  
{  
    if(n<m)  
        return 0;  
    if(n<M&&m<M)  
        return fac[n]*inv[m]%M*inv[n-m]%M;  
    return C(n%M,m%M)*C(n/M,m/M)%M;  
}  
int main()
{
	int T,a,b;
	scanf("%d",&T);
	pre();
	while(T--)
	{
		scanf("%d%d",&a,&b);
		printf("%d\n",C(a,b));
	}
	return 0;
}


你可能感兴趣的:(数论)