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;
}

 

原文地址:https://www.cnblogs.com/hsqdboke/p/2483145.html