[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