[BZOJ2982]combination Lucas定理

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2982

$C(N,M)\% P = C(N\% P,M\% P) * C(N/P,M/P)\% P$

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int mod=1e4+7;
 6 int inv[10010],fac[10010];
 7 int C(int x,int y){
 8     if(x<y) return 0;
 9     return fac[x]*inv[fac[y]]%mod*inv[fac[x-y]]%mod;
10 }
11 int main(){
12     inv[1]=1;for(int i=2;i<10007;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
13     fac[0]=1;for(int i=1;i<10007;i++) fac[i]=fac[i-1]*i%mod;
14     int Test;
15     scanf("%d",&Test);
16     while(Test--){
17         int N,M;
18         scanf("%d%d",&N,&M);
19         if(N<M){
20             puts("0");
21             continue;
22         }
23         int Ans=1;
24         while(M){
25             Ans=Ans*C(N%mod,M%mod)%mod;
26             N/=mod;
27             M/=mod;
28         }
29         printf("%d\n",Ans);
30     }
31     return 0;
32 }

 

posted @ 2017-11-03 21:37  halfrot  阅读(169)  评论(0编辑  收藏  举报