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\) 表示男生的方案数。
根据乘法原理,相乘取和即是最终答案。
一些注意事项:
-
开 \(\rm long~long\)。
-
求组合数时,应运用公式 \(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;
}

浙公网安备 33010602011771号