【BZOJ】【2982】Combination

排列组合

  Lucas定理模板题……

  感觉我做题顺序有点问题啊……应该是BZOJ 2982-->HDOJ 3037-->BZOJ 1272

  好吧这个现在来看就有些水了……

  预处理一下fact和inv即可

 1 /**************************************************************
 2     Problem: 2982
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:4 ms
 7     Memory:1352 kb
 8 ****************************************************************/
 9  
10 //BZOJ 2982
11 #include<cstdio>
12 #include<cstdlib>
13 #include<cstring>
14 #include<iostream>
15 #include<algorithm>
16 #define rep(i,n) for(int i=0;i<n;++i)
17 #define F(i,j,n) for(int i=j;i<=n;++i)
18 #define D(i,j,n) for(int i=j;i>=n;--i)
19 using namespace std;
20  
21 int getint(){
22     int v=0,sign=1; char ch=getchar();
23     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
24     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
25     return v*=sign;
26 }
27 /*******************tamplate********************/
28 const int N=10086,P=10007;
29 int fac[N],inv[N],n,m;
30 int pow(int a,int b){
31     int r=1;
32     for(;b;b>>=1,a=a*a%P)
33         if (b&1) r=r*a%P;
34     return r;
35 }
36 void calc(){
37     fac[0]=1;
38     F(i,1,P-1) fac[i]=fac[i-1]*i%P;
39     inv[P-1]=pow(fac[P-1],P-2); inv[0]=1;
40     D(i,P-2,1) inv[i]=inv[i+1]*(i+1)%P;
41 }
42 inline int c(int n,int m){
43     if (n<m) return 0;
44     if (n<P && m<P) return fac[n]*inv[m]%P*inv[n-m]%P;
45     return c(n%P,m%P)*c(n/P,m/P)%P;
46 }
47 int main(){
48     int T=getint();
49     calc();
50     while(T--){
51         n=getint(); m=getint();
52         printf("%d\n",c(n,m));
53     }
54     return 0;
55 }
View Code

 

posted @ 2015-02-21 21:34  Tunix  阅读(229)  评论(0编辑  收藏  举报