P2822 [NOIP2016 提高组] 组合数问题

本题考察了组合数的递推以及矩阵前缀和。我们可以得出:

Cnm=n!m!(nm)!=(n1)!(nm1)!m!+(n1)!(nm)!(m1)!={1,m=norm=0Cn1m+Cn1m1,otherwise

这其实也是一个杨辉三角

如何解决数据范围极大的问题?使用矩阵前缀和即可。见代码:

#include<bits/stdc++.h>
using namespace std;
int s[2005][2005],c[2005][2005],t,k,n,m;
signed main(){
	scanf("%d%d",&t,&k);
	c[1][1]=1;
	for(int i=0;i<=2000;c[i][0]=1,i++)
		for(int j=1;j<=i;j++)
			c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
	for(int i=2;i<=2000;s[i][i+1]=s[i][i],i++)
		for(int j=1;j<=i;j++)
			s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+!(c[i][j]);
	while(t--){
		scanf("%d%d",&n,&m);
		if(m>n) m=n;
		if(m==0) puts("1");
		printf("%d\n",s[n][m]);
	}
	return 0;
}
posted @   robinyqc  阅读(21)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示