[bzoj2982] combination

  这题面D人D得好狠啊

  求组合数。。模数10007所以lucas一发。。

  求一波逆元算较小的组合数。或者暴力跑也可以

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const int modd=10007;
 8 int jc[modd],ny[modd];
 9 int i,j,k,n,m;
10 bool gg;
11  
12 int ra;char rx;
13 inline int read(){
14     rx=getchar(),ra=0;
15     while(rx<'0'||rx>'9')rx=getchar();
16     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
17 }
18 inline int poi(int a,int b){
19     int c=1;
20     while(b){
21         if(b&1)c=c*a%modd;
22         b>>=1,a=a*a%modd;
23     }return c;
24 }
25 inline int getc(int n,int m){
26     if(n<m)return 0;
27     return 1LL*jc[n]*ny[m]*ny[n-m]%modd;
28 }
29 inline int lucas(int n,int m){
30     if(n<modd&&m<modd)return getc(n,m);
31     else return lucas(n/modd,m/modd)*getc(n%modd,m%modd)%modd;
32 }
33 int main(){
34     n=read();
35     for(i=jc[0]=ny[0]=1;i<modd;i++)jc[i]=jc[i-1]*i%modd,ny[i]=poi(jc[i],modd-2);
36     while(n--)j=read(),printf("%d\n",lucas(j,read()));
37     return 0;
38 }
39 
View Code

 

posted @ 2016-06-18 15:46  czllgzmzl  阅读(125)  评论(0编辑  收藏  举报