1. 程式人生 > >HDU 2200 Eddy's AC難題(排列組合)

HDU 2200 Eddy's AC難題(排列組合)

Eddy's AC難題

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6759    Accepted Submission(s): 3245


 

Problem Description

Eddy是個ACMer,他不僅喜歡做ACM題,而且對於Ranklist中每個人的ac數量也有一定的研究,他在無聊時經常在紙上把Ranklist上每個人的ac題目的數量摘錄下來,然後從中選擇一部分人(或者全部)按照ac的數量分成兩組進行比較,他想使第一組中的最小ac數大於第二組中的最大ac數,但是這樣的情況會有很多,聰明的你知道這樣的情況有多少種嗎?

特別說明:為了問題的簡化,我們這裡假設摘錄下的人數為n人,而且每個人ac的數量不會相等,最後結果在64位整數範圍內.

 

 

Input

輸入包含多組資料,每組包含一個整數n,表示從Ranklist上摘錄的總人數。

 

 

Output

對於每個例項,輸出符合要求的總的方案數,每個輸出佔一行。

 

 

Sample Input

 

2 4

 

 

Sample Output

 

1 17

 

思路: (轉:https://blog.csdn.net/lz161530245/article/details/79513751

#include<iostream>
#include<cstdio>
using namespace std;
long long solve(long long x,long long y) //求C n m *(x-1)
{
	long long ans = 1;
    for (long long int i=1;i<=x;i++)
    {
        ans=ans*(y-i+1)/i;
    }
    return ans*(x-1);
}
int main()
{
	long long n;
	while(~scanf("%lld",&n))
	{
		if(n<2) 
		{
			printf("0\n");
			continue;
		}
		long long sum=0;
		long long i;
		
//	cout<<m<<endl;
		for(i=2;i<=n;i++)
		{
		//	long long m=1;
		//	long long j=i,N=n;
		//	while(j--)
		//	{
		//		m*=N;
		//		N--; 
		//	}
		//	cout<<sum<<endl;
			sum+=solve(i,n);
		}
		printf("%lld\n",sum);
	}
	return 0;
}