zoukankan      html  css  js  c++  java
  • 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;
    }

     

  • 相关阅读:
    JS 集合
    JS 字典
    JS 链表
    JS 队列
    JS 栈
    JS 列表
    JS 数组
    IOS 提示无法下载程式问题
    ubuntu 下安装Go开发环境
    菜鸟看Redis(一)
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2483145.html
Copyright © 2011-2022 走看看