• hdu2049 不容易系列之(4)——考新郎(组合,错排)


    题意:

    n 个数中 m 个数错排的情况个数。

    思路:

    先从 n 个数中选出 m 个,即 $C_n^m$,

    再算出 m 个数的错排数,即 ${f_{left( m ight)}}$。

    错排:

    当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用f(n)表示,那么f(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推

    第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法

    第二步,放编号为k的元素,这时有两种情况


        ( 1 ) 把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有f(n-2)种方法;

        ( 2 ) 第k个元素,不把它放到位置n,这时,对于这n-1个元素,有f(n-1)种方法;

    综上得到:f (n) = (n-1)*( f(n-2) + f(n-1) )
          
    特殊地,f (1) = 0, f (2) = 1

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    ll c[25][25],f[25]={0,0,1};
    
    void Init(){
        for(int n=0;n<=20;n++)//Cn 0和Cn n都置为1
            c[n][0]=c[n][n]=1;
        for(int n=1;n<=20;n++)//Cn 1到Cn n-1由递推公式求得
            for(int m=1;m<n;m++)
                c[n][m]=c[n-1][m-1]+c[n-1][m];
        for(int i=3;i<=20;i++)//规模为i的错排的递推
            f[i]=(i-1)*(f[i-1]+f[i-2]);
    }
    
    int main()
    {
        Init();//初始化组合、错排表
        ll t,n,m;cin>>t;
        while(t--){
            cin>>n>>m;
            cout<<c[n][m]*f[m]<<endl;
        }
        return 0;
    }

    参考博客:Hdu 2049解题报告

  • 相关阅读:
    项目不能imports同名命名空间
    表格分页
    关于Web Post信息的编码
    JJHIS构想
    asp.net客户端传参的小结
    注销类业务的处理
    枚举类型的一些用法总结
    MO功能使能情况
    在内嵌页面得到某个内嵌页面所在的frame
    不同包里的全局变量定义方式及系统配置处理
  • 原文地址:https://www.cnblogs.com/Kanoon/p/12464649.html
Copyright © 2020-2023  润新知