组合数递推模板题

BJSY_XYH 2023-07-25 16:46:48 2023-07-25 16:56:47 16 返回题目

考虑中第n个元素的状态,有两种情况

1.若选 ,则还需要前 个元素中选 个,在方案数为

2.若不选 ,则还需要前 个元素中选 个,方案数为

=+


由于 , 固定,故可以预处理 的值,计算二位前缀和。

具体的: 表示 时有多少对 满足题意,则有:

在询问 时直接输出 即可

//组合数递推:
for(int i=0;i<=2000;i++){
	f[i][0]=1;
}
for(int i=1;i<=2000;i++){
	for(int j=1;j<=i;j++){
		f[i][j]=f[i-1][j-1]+f[i-1][j];
		f[i][j]%=k;
	}
}
//前缀和:
for(int i=1;i<=2000;i++){
	for(int j=1;j<=2000;j++){
		S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1];
		if(j<=i&&f[i][j]%k==0){
			S[i][j]++;
		}
	}
}
{{ vote && vote.total.up }}