[bzoj2982]combination(组合数学lucas定理)

来源:互联网 发布:数据分析 用户画像 编辑:程序博客网 时间:2024/05/21 07:53

题目:

求C(n, m) mod 10007(1<=m<=n<=200,000,000)

题解:

Lucas裸题收好

代码:

#include <cstdio>#define LL long longusing 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);    }}
原创粉丝点击