【杭电100题】【错排】2068 RPG的错排

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068
参考1:错排公式讲解:https://blog.csdn.net/qq_18661257/article/details/47663825
参考2:题目代码:https://blog.csdn.net/qq_30076791/article/details/47679101

#include <iostream>

using namespace std;

__int64 num[26];    //错排i个元素的排列个数
__int64 C(int m, int n)
{
    __int64 s=1;
    for(int i=1,j=m; i<=n; i++,j--)
        s*=j;
    for(int i=1; i<=n; i++)
        s/=i;
    return s;
}

__int64 A(int n)
{
    int s=1;
    for(int i=1; i<=n; i++)
        s*=i;
    return s;
}

int main()
{
    num[0]=1;   //错排0个,即全部排对
    num[1]=0;
    num[2]=1;
    for(int i=3; i<26; i++)
    {
        num[i]=(i-1)*(num[i-1]+num[i-2]);
    }

    int n;
    while(scanf("%d",&n)&&n)
    {
        __int64 s=0;
        for(int i=0; i<=n/2; i++)
            s+=num[i]*C(n, i);      //任取i个数错排
        cout<<s<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/88319517