专栏文章

题解:SP10377 MECGROUP - project groups

SP10377题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio9y3sp
此快照首次捕获于
2025/12/02 15:46
3 个月前
此快照最后确认于
2025/12/02 15:46
3 个月前
查看原文

关于本题

本题涉及到简单组合数的计算,建议评黄。

题目翻译

某大学计算机系教授向学生问了一个关于年终项目的结组问题。他要求每组至少包含 44 个男生和 11 个女生。
Rajesh 是一个有好奇心的人,他想知道对于一个组有多少种结组情况。但是他很忙,所以请你写一个程序帮帮他算出答案。

输入格式

第一行是一个整数 nn,表示有多少个测试用例。
每个测试用例包含三个数字 BGtB \, G \, t,分别代表男生有多少人,女生有多少人,一组要求有多少个人。

约束条件

对于所有测试数据,保证:
  • 1n201≤n≤20
  • 4B304≤B≤30
  • 1G301≤G≤30
  • 5tB+G5≤t≤B+G

输出格式

对于每个测试用例,一行一个整数表示答案。

样例1 输入

CPP
2
4 1 5
30 30 20

样例1 输出

CPP
1
4191318957352590

题解

发现 B,GB,Gnn 都很小,考虑暴力。
假设当前 tt 人中男生为 ii,女生数量就是 tit-i,对于这一种数量的贡献是 (Bi)(tiG)\binom{B}{i}\binom{t-i}{G},直接累加。
对于组合数,本题没有设置模数限制,所以不能预处理阶乘,考虑使用杨辉三角
代码如下:
CPP
#include<bits/stdc++.h>
using namespace std;
#define i64 long long
i64 yh[114][114];
void init(int num){
	for(int i=1;i<=num;++i){
		yh[i][1]=yh[i][i]=1;
		for(int j=2;j<i;++j){
			yh[i][j]=(yh[i-1][j]+yh[i-1][j-1]);
		}
	}
}
i64 C(int n,int m){
	return yh[n+1][m+1];
}
i64 n,m,tt,res;
//define NaraFluorine
int main(){
	init(100);
	int t=1;
	cin>>t;
	while(t--){
		cin>>n>>m>>tt;
		res=0;
		for(i64 i=4;i<=n;++i){
			for(i64 j=1;j<=m;++j){
				if((i+j)==tt){
					res+=C(n,i)*C(m,j);
				}
			}
		}
		cout<<res<<'\n';
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...