[关闭]
@PaulGuan 2016-10-08T15:34:34.000000Z 字数 844 阅读 684

K - The World is a Theatre 题解

算法 题解


题目大意

要选出t个人,包含至少4个男生和至少1个女生,问有多少选择方法。(4 ≤ n ≤ 30, 1 ≤ m ≤ 30, 5 ≤ t ≤ n + m)

分析

本题基本思路就是用组合数学的思想进行计算,不过这里要注意,在进行组合数计算时需要优化,不然会超出数据范围。比如,我们的组合数公式为C(n,m)=m!/(n!*(m-n)!),这里如果逐个进行阶乘计算肯定是会溢出的,我们可以算max(n!,(m-n)!)+1到m的累乘数再除以min(n!,(m-n)!)。但是这种方法肯定不是最佳方法,我在用这种方法时,恰好最大数据C(15,30)时溢出……于是只好手算打表这个数据。

代码

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. unsigned long long jc(unsigned long long n,unsigned long long m)
  5. {
  6. unsigned long long i,ans=1;
  7. for(i=m+1;i<=n;i++)
  8. {
  9. ans*=i;
  10. }
  11. return ans;
  12. }
  13. unsigned long long c(unsigned long long n,unsigned long long m)
  14. {
  15. if(n==30&&m==15)
  16. return 155117520;//这就是打表
  17. unsigned long long zj=jc(n,max(m,n-m));
  18. unsigned long long ans=zj/jc(min(m,n-m),0);
  19. return ans;
  20. }
  21. int main(void)
  22. {
  23. unsigned long long n,m,t;
  24. unsigned long long ans=0;
  25. cin>>n>>m>>t;
  26. unsigned long long i,j;
  27. for(i=4;i<=n;i++)
  28. {
  29. for(j=1;j<=m;j++)
  30. {
  31. if(i+j!=t)
  32. continue;
  33. ans+=c(n,i)*c(m,j);
  34. }
  35. }
  36. cout<<ans<<endl;
  37. return 0;
  38. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注