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 }