题目:
求C(n, m) mod 10007(1<=m<=n<=200,000,000)
题解:
Lucas裸题收好
代码:
#include <cstdio>
#define LL long long
using namespace std;
const int mod=10007;
const int N=10010;
LL mul[N],inv[N];int n,m;
void pre()
{
int i;
mul[1]=1;
for (i=2;i<mod;i++) mul[i]=mul[i-1]*i%mod;
inv[0]=inv[1]=1;
for (i=2;i<mod;i++) inv[i]=(mod-(mod/i))*inv[mod%i]%mod;
for (i=2;i<mod;i++) inv[i]=inv[i]*inv[i-1]%mod;
}
LL C(int n,int m)
{
if (m>n) return 0;
return mul[n]*inv[n-m]%mod*inv[m]%mod;
}
LL Lucas(int n,int m)
{
if (m>n) return 0;
LL ans=1;
for (;m;m/=mod,n/=mod) ans=ans*C(n%mod,m%mod)%mod;
return ans;
}
int main()
{
int T;
scanf("%d",&T);
pre();
while (T--)
{
scanf("%d%d",&n,&m);
printf("%lld\n",Lucas(n,m)%mod);
}
}