题解 B3717 组合数问题

大家好,我是 CQ-C2024 蒟蒻 CJH。

最近回来复习一下组合数,于是就看到了这一道题。

题意

给定两个整数 $n,m$,求出 $\dbinom{n}{m}$。

分析

根据组合数的定义可知:

$$\dbinom{n}{m}=\dfrac{n!}{m!(n-m)!}$$

根据数据范围 $1 \leq T \leq 5 \times 10^6$,$0 \leq m \leq n \leq N \leq 5 \times 10^6$,可知单次求组合数时间复杂度为 $O(1)$ 才行。

很容易想到预处理阶乘以及乘法逆元的阶乘。

总体时间复杂度 $O(N+T)$。

代码

//the code is from chenjh
#include<cstdio>
#define MAXN 5000005
typedef long long LL;
const int mod=998244353;
int f[MAXN],inv[MAXN];//阶乘以及乘法逆元。
int main(){
    int T,N;scanf("%d%d",&T,&N);
    f[0]=f[1]=inv[0]=inv[1]=1;//记得赋初始值!
    for(int i=2;i<=N;i++) f[i]=(LL)f[i-1]*i%mod,inv[i]=(LL)(mod-mod/i)*inv[mod%i]%mod;//递推阶乘和逆元,中间运算可能会超过 long long,所以需要临时转换类型。
    for(int i=1;i<=N;i++) inv[i]=(LL)inv[i-1]*inv[i]%mod;//预处理逆元的阶乘。
    int ans=0;
    for(int n,m;T--;)scanf("%d%d",&n,&m),ans^=(LL)f[n]*inv[m]%mod*inv[n-m]%mod;//根据组合数公式求出组合数。
    printf("%d\n",ans);
    return 0;
}

关于此题的题外话

因为此题只有一组数据,所以用以下的代码也可以 AC 此题:

main(){puts("522716868");}

故请求管理员加强数据。

posted @ 2023-05-18 15:17  Chen_Jinhui  阅读(45)  评论(0)    收藏  举报  来源