HDU 2200 Eddy's AC難題(排列組合)
阿新 • • 發佈:2018-11-12
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; }