HDU 2068 RPG的错排

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068

此题考查错排公式,组合数运算,正确的数目用组合,错误的情况用错排。

错排公式为:F(n)=(n-1)*(F(n-1)+F(n-2));

F(1)=0;F(2)=1;……

AC 代码为:

#include<iostream>

using namespace std;

__int64 a[13]={0,0,1};//只需要定义到a[13]即可,因为最大为25

void fun()

{

    for(int i=3;i<=12;i++)

      a[i]=(i-1)*(a[i-1]+a[i-2]);    

}

int cnm(int n,int m)

{

    int s=1;

    for(int i=1;i<=m;i++)

     s=s*(n--)/i;

     return s;

}

int main()

{

    //freopen("d:\\1.txt","r",stdin);

    fun();    

    int n;

    while(scanf("%d",&n)!=EOF&&n)

    {

        __int64 s=0; //__int64类型

        if(n<=3)cout<<1<<endl; //小于4的情况不适合下面的情况

        else

        {

        for(int i=(n+1)/2;i<=n-2;i++)//直到算到错排为2的情况  不存在错排为1的

         {

             s+=(cnm(n,i)*a[n-i]);

         }

         printf("%I64d\n",s+1);//错排为0的情况为1种  即全对的情况

        }

    }

    return 0;

}

 

 

你可能感兴趣的:(HDU)