Bzoj2982 combination
Submit: 492 Solved: 303
Description
LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样。那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值。(1<=m<=n<=200,000,000)
Input
第一行一个整数t,表示有t组数据。(t<=200)
接下来t行每行两个整数n, m,如题意。
Output
T行,每行一个数,为C(n, m) mod 10007的答案。
Sample Input
4
5 1
5 2
7 3
4 2
5 1
5 2
7 3
4 2
Sample Output
5
10
35
6
10
35
6
HINT
Source
数学问题 组合数 lucas定理模板题
蠢蠢蠢,推了半天不同选择顺序的方案数,抬头一看只要输出一个C(n,m)
cnm!
忘了判n<m return 0,还RE了一次
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mod=10007; 10 const int mxn=100010; 11 int read(){ 12 int x=0,f=1;char ch=getchar(); 13 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 14 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 int pw[mxn],inv[mxn]; 18 void init(){ 19 pw[1]=1;inv[1]=1; 20 pw[0]=1;inv[0]=1; 21 for(int i=2;i<mod;i++){ 22 pw[i]=pw[i-1]*i%mod; 23 inv[i]=(-(mod/i)*inv[mod%i]%mod+mod)%mod; 24 } 25 return; 26 } 27 int calc(int n,int m){ 28 if(n<m)return 0; 29 return pw[n]*inv[pw[m]]%mod*inv[pw[n-m]]%mod; 30 } 31 int lucas(int n,int m){ 32 if(!m)return 1; 33 return calc(n%mod,m%mod)*lucas(n/mod,m/mod)%mod; 34 } 35 int n,m; 36 int main(){ 37 int i,j; 38 int T=read(); 39 init(); 40 while(T--){ 41 n=read();m=read(); 42 printf("%d\n",lucas(n,m)); 43 } 44 return 0; 45 }
本文为博主原创文章,转载请注明出处。