HDU 2200 Eddy's AC难题
Eddy's AC难题
Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目的数量摘录下来,然后从中选择一部分人(或者全部)按照ac的数量分成两组进行比较,他想使第一组中的最小ac数大于第二组中的最大ac数,但是这样的情况会有很多,聪明的你知道这样的情况有多少种吗?
特别说明:为了问题的简化,我们这里假设摘录下的人数为n人,而且每个人ac的数量不会相等,最后结果在64位整数范围内.
特别说明:为了问题的简化,我们这里假设摘录下的人数为n人,而且每个人ac的数量不会相等,最后结果在64位整数范围内.
Input
输入包含多组数据,每组包含一个整数n,表示从Ranklist上摘录的总人数。
Output
对于每个实例,输出符合要求的总的方案数,每个输出占一行。
Sample Input
2 4
Sample Output
1 17
解题思路:
本题有多组测试,给出一个整数n为从Rank上摘录的人数,将摘录的人分为两组,其中一组的所有人的AC数大于另一组,保证每个人的AC数都不一致。
选出了n人,但是在分组时不一定将所有人都分组,所以我们m从2 ~ n选择分组人数,选择的种数可以用组合数计算得到,将选出的所有人按AC数量排序,若将一组个数为m有序数拆分为两组,使其中一组的所有值大于另一组,可以在每两个数中间进行拆分这样便是求间隔的个数即为n-1。
排列组合相关运算
样例分析:
2:
挑出2个数有2! / ((2 - 2)! * 2!) = 2 / (1 * 2) = 1
2个数分为两组有1种情况,答案 = 1 * 1 = 1
4:
挑出2个数有 4! / ((4 - 2)! * 2!) = 6
2个数分为两组有1种情况 挑出2个数时所有分组情况为6 * 1 = 6;
挑出3个数有 4! / ((4 - 3)! * 3! = 4
3个数分为两组有3 - 1 = 2种情况 挑出3个数时所有分组情况为4 * 2 = 8
挑出4个数有 4! / ((4 - 4)! * 4!) = 1
4个数分为两组有4 - 1 = 3种情况 挑出4个数时所有分组情况为1 * 3 = 3
答案 = 6 + 8 + 3 = 17
AC代码
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 LL clt(int n){ 5 LL ans = 0; //初始化答案为0 6 for(int i = 2; i <= n; i++){ //从2个到n个挑出数字 7 LL temp = 1; 8 for(int j = 1; j <= i; j++){ //计算组合数 9 temp = temp * (n - j + 1) / j; 10 } 11 ans += temp * (i - 1); //计算答案 12 } 13 return ans; 14 } 15 int main() 16 { 17 int n; 18 while(scanf("%d", &n) != EOF){ //输入摘录人数 19 if(n < 2){ //人数小于2无法分为两组输出0 20 printf("0\n"); 21 continue; 22 } 23 LL ans = clt(n); //人数大于2计算答案 24 printf("%lld\n", ans); 25 } 26 return 0; 27 }