LightOJ 1067 Combinations 组合数取模

来源:互联网 发布:unity3d发布ios教程 编辑:程序博客网 时间:2024/06/06 17:52

题意是求C(n,m) % (1e6 + 3)

我看别人都是用lucas定理解的,我是暴力求解的,打0-n的逆元表,然后直接算

#include<stdio.h>#include<iostream>#include<math.h>#include<cstring>using namespace std;#define LL long longconst LL MOD = 1000003;const LL MAXN = 1000000;LL mul(LL a,LL b){return (a * b) % MOD;}LL add(LL a,LL b){return (a + b) % MOD;}LL inv[MAXN + 1];LL mulinv[MAXN + 1];LL muln[MAXN + 1];void pre(){    inv[0] = 1;    inv[1] = 1;    for(int i = 2; i <= MAXN; i++)        inv[i] = ((MOD - MOD / i) * inv[MOD % i]) % MOD;}void pre2(){    mulinv[0] = 1;    muln[0] = 1;    for(int i = 1; i <= MAXN; i++){        mulinv[i] = mul(mulinv[i - 1] , inv[i]);        muln[i] = mul(muln[i - 1] , i);    }}int main(){    int tt;    scanf("%d",&tt);    LL ans;    LL n,m;    pre();    pre2();    for(int t=1;t<=tt;t++){        scanf("%lld%lld",&n,&m);        ans = mul(muln[n] , mulinv[m]);        ans = mul(ans , mulinv[n - m]);        printf("Case %d: %lld\n",t,ans);    }    return 0;}


0 0
原创粉丝点击