hdu2068 RPG的錯排

RPG的錯排

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9816    Accepted Submission(s): 4020


Problem Description
今年暑假杭電ACM集訓隊第一次組成女生隊,其中有一隊叫RPG,但做爲集訓隊成員之一的野駱駝竟然不知道RPG三個人具體是誰誰。RPG給他機會讓他猜猜,第一次猜:R是公主,P是草兒,G是月野兔;第二次猜:R是草兒,P是月野兔,G是公主;第三次猜:R是草兒,P是公主,G是月野兔;......可憐的野駱駝第六次終於把RPG分清楚了。由於RPG的帶動,做ACM的女生越來越多,我們的野駱駝想都知道她們,可現在有N多人,他要猜的次數可就多了,爲了不爲難野駱駝,女生們只要求他答對一半或以上就算過關,請問有多少組答案能使他順利過關。
 

Input
輸入的數據裏有多個case,每個case包括一個n,代表有幾個女生,(n<=25), n = 0輸入結束。
 

Sample Input
1 2 0
 

Sample Output
1 1


錯排列,組合問題

錯排公式:D(n) = n! [(-1)^2/2! + … + (-1)^(n-1)/(n-1)! + (-1)^n/n!]  ,  D(1) = 0, D(2) = 1

D(n)爲錯排列個數,n爲元素個數

本題需要求0~n/2之間錯排列的總個數

所以, D(1)*c(1, n) + ……+D(k)*c(k, n) +……+ D(n)*c(n, n)

#include <iostream>
typedef long long LL;

using namespace std;

LL f(int i, int n)
{
    LL ret = 1;
    while (i++ < n)
    {
        ret *= i;
    }
    return ret;
}

LL C(int k, int n)            //求C(k, n)
{
    LL ret = 1;
    for (int i = n-k+1; i <= n; i++)
        ret *= i;
    for (int i = 2; i <= k; i++)
        ret /= i;
    return ret;
}

int main()
{
    int n;
    LL sta[15] = {0};
    sta[1] = 0;
    sta[2] = 1;
    for (int i = 3; i < 14; i++)
    {
        for (int j = 2; j <= i; j++)
        {
            if (j & 1)
                sta[i] -= f(j, i);
            else
                sta[i] += f(j, i);
        }
    }
    while (cin >> n, n)
    {
        LL ans = 1;
        for (int i = 1; i <= n/2; i++)
            ans += C(i, n)*sta[i];
        cout << ans << endl;
    }
    return 0;
}


發佈了44 篇原創文章 · 獲贊 16 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章