Eddy's AC难题
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5860 Accepted Submission(s): 2782
Problem Description
Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目的数量摘录下来,然后从中选择一部分人(或者全部)按照ac的数量分成两组进行比较,他想使第一组中的最小ac数大于第二组中的最大ac数,但是这样的情况会有很多,聪明的你知道这样的情况有多少种吗?
特别说明:为了问题的简化,我们这里假设摘录下的人数为n人,而且每个人ac的数量不会相等,最后结果在64位整数范围内.
Input
特别说明:为了问题的简化,我们这里假设摘录下的人数为n人,而且每个人ac的数量不会相等,最后结果在64位整数范围内.
输入包含多组数据,每组包含一个整数n,表示从Ranklist上摘录的总人数。
Output
对于每个实例,输出符合要求的总的方案数,每个输出占一行。
Sample Input
2 4
1 17
Eddy
问题链接:HDU2200 Eddy's AC难题
问题简述:参见上文。
问题分析:将n个数排序,然后分成两组,这种分法共有n-1种,各种情况算一下组合即可。据说这种做法在高中数学中称为插板。
程序说明:函数C()的实现原理需要看参考链接的那篇博文。题记:(略)
参考链接:HDU2519 新生晚会【组合计算】
AC的C++语言程序如下:
/* HDU2200 Eddy's AC难题 */ #include <stdio.h> /* 计算组合函数:n中取m */ long long C(int n, int m) { long long s=1; int i; for(i=1; i<=m; i++) s = s * (n - i + 1) / i; return s; } int main(void) { int n, i; long long ans; while(scanf("%d", &n) != EOF) { ans = 0; for(i=2; i<=n; i++) ans += (i - 1) * C(n, i); printf("%lld ", ans); } return 0; }