题目描述。。。。
很简单的求组合数,预处理阶乘和逆元就好了
Lucas定理C(n,m)=C(n/Mod,m/Mod)*C(n%Mod,m%Mod)
证明什么的这不重要。。。
线性推逆元inv[i]=-(Mod/i)*inv[Mod%i]%Mod
#include<cstdio>
#include<cstring>
#include<iostream>
#define Mod 10007
#define LL long long
using namespace std;
LL n,m,fac[100000],inv[100000];
int T;
LL C(LL n,LL m){
if(n<m)return 0;
if(n<=Mod&&m<=Mod)
return fac[n]*inv[fac[m]]%Mod*inv[fac[n-m]]%Mod;
return C(n%Mod,m%Mod)*C(n/Mod,m/Mod)%Mod;
}
int main(){
scanf("%d",&T);fac[0]=1;
for(int i=1;i<100000;i++)fac[i]=fac[i-1]*i%Mod;
inv[1]=1;for(int i=2;i<100000;i++){
inv[i]=-(Mod/i)*inv[Mod%i]%Mod;
if(inv[i]<0)inv[i]+=Mod;
}
while(T--){
scanf("%lld%lld",&n,&m);
printf("%lld\n",C(n,m));
}
return 0;
}