• HDOJ 2068 RPG的错排


    错排+组合数
    错排数:
    0, 1, 2, 9, 44, 265, 1854, 14833, 133496, 1334961, 14684570, 176214841, 2290792932, ... 
    公式:

    对于排列数较多的情况,难以采用枚举法。这时可以用递归思想推导错排数的递推公式。

    显然D1=0,D2=1。当n≥3时,不妨设n排在了第k位,其中k≠n,也就是1≤k≤n-1。那么我们现在考虑第n位的情况。

    • 当k排在第n位时,除了n和k以外还有n-2个数,其错排数为Dn-2
    • 当k不排在第n位时,那么将第n位重新考虑成一个新的“第k位”,这时的包括k在内的剩下n-1个数的每一种错排,都等价于只有n-1个数时的错排(只是其中的第k位会换成第n位)。其错排数为Dn-1

    所以当n排在第k位时共有Dn-2+Dn-1种错排方法,又k有从1到n-1共n-1种取法,我们可以得到:

    Dn=(n-1)(Dn-1+Dn-2


    RPG的错排

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


    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
    120
     

    Sample Output
    11
     

    Author
    Rabbit
     

    Source
    RPG专场练习赛
     

    Recommend
    lcy
     
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 
     5 using namespace std;
     6 
     7 typedef long long int64;
     8 
     9 int64 a[13]={0,0,1,2,9,44,265,1854,14833,133496,1334961,14684570,176214841};
    10 
    11 int64 comb(int n,int m)
    12 {
    13     if (m==0)
    14       {
    15            return 1;
    16       }
    17       int64 up = 1,down = 1;
    18       for (int i=0; i<m; i++)
    19       {
    20             up*=n-i;
    21             down*=i+1;
    22       }
    23       return up/down;
    24 }
    25 
    26 int main()
    27 {
    28     int n;
    29     while(cin>>n&&n)
    30     {
    31         if(n==2||n==1||n==3)
    32         {   cout<<1<<endl;  continue; }
    33         int64 ans=1;
    34         for(int i=2;i<=n/2;i++)
    35             ans+=comb(n,i)*a[i];
    36 
    37         printf("%I64d\n",ans);
    38     }
    39 
    40     return 0;
    41 }
  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/CKboss/p/3081510.html
Copyright © 2020-2023  润新知