CF131C The World is a Theatre

洛谷题面

题目大意

给定 \(n,m,t\),表示有 \(n\) 个男孩,\(m\) 个女孩,现在要选出 \(t\) 人。

并且保证至少有 \(4\) 个男孩, \(1\) 个女孩。

问有多少种选择方法。

题目分析

答案为

\[\sum\limits^{\min\{m,t-4\}}_{i=\max\{1,t-n\}} C_{m}^{i}\times C_{n}^{t-i} \]


下面来讲一下这个式子的来源。

来看一下这个式子。

我们枚举 \(i\),下界是 \(\max\{1,t-n\}\),表示从 \(t\) 个人中减去 \(n\) 个男生的数量,剩下的就是女生最少需要的数量

上界是 \(\min\{m,t-4\}\),表示从 \(t\) 个人中,减去男生至少需要的人数,剩下的就是女生最多需要的数量。

\(C_{m}^i\) 表示女生的方案数,\(C^{t-i}_n\) 表示男生的方案数。

根据乘法原理,相乘取和即是最终答案。


一些注意事项:

  1. \(\rm long~long\)

  2. 求组合数时,应运用公式 \(C_{n}^m=C_{n-1}^m+C_{n-1}^{m-1}\)

代码

#define int long long

const int ma=35;

int C[ma][ma];

int n,m,t;

inline void init()
{
	for(register int i=0;i<=31;i++)
	{
		C[i][0]=1;
	}
	
	for(register int i=1;i<=31;i++)
	{
		for(register int j=1;j<=i;j++)
		{
			C[i][j]=C[i-1][j]+C[i-1][j-1];
		}
	}
} 

#undef int

int main(void)
{
	#define int long long
	
	n=read(),m=read(),t=read();
	
	init(); 
	
	int ans=0;
	
	for(register int i=max(1ll,t-n);i<=min(t-4,m);i++)
	{
		ans+=C[m][i]*C[n][t-i];
	}
	
	printf("%lld\n",ans);
	
	return 0;
} 
posted @ 2021-10-20 23:14  Coros_Trusds  阅读(55)  评论(0)    收藏  举报