• 错排问题


    错排问题

    NowCoder每天要给很多人发邮件。有一天他发现发错了邮件,把发给A的邮件发给了B,把发给B的邮件发给了A。于是他就思考,要给n个人发邮件,在每个人仅收到1封邮件的情况下,有多少种情况是所有人都收到了错误的邮件?
    即没有人收到属于自己的邮件。

    输入描述:

    输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。

    输出描述:

    对应每一组数据,输出一个正整数,表示无人收到自己邮件的种数。 示例1 输入

    2 3 输出

    1 2

    解法:

    https://www.nowcoder.com/questionTerminal/95e35e7f6ad34821bc2958e37c08918b
    来源:牛客网
    当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
    第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
    第二步,放编号为k的元素,这时有两种情况:⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;
    综上得到
    D(n) = (n-1) [D(n-2) + D(n-1)]
    特殊地,D(1) = 0, D(2) = 1.
    有了递推公式,一切就迎刃而解了。

    #include<stdio.h>
    int main (void)
    {
        long long der[ 21 ] = { 0, 0, 1 };
        int i;
        for ( i = 3; i < 21; i++ ){
            der[ i ] = ( i - 1 ) * ( der[ i - 2] + der[ i - 1 ] );
        }
    
        int n;
        while ( scanf( "%d", &n ) != EOF ){
            printf("%lld
    ", der[ n ] );
        }
        return 0;
    }
  • 相关阅读:
    nyoj--767--因子和(模拟)
    poj--1703--Find them, Catch them(并查集巧用)
    nyoj--1009--So Easy[Ⅰ](数学)
    nyoj--1011--So Easy[II](数学几何水题)
    nyoj--311--完全背包(动态规划,完全背包)
    morhpia(4)-更新
    morphia(5)-删除
    morphia(6-1)-查询
    redis 分页
    mongodb-安装&配置&启动
  • 原文地址:https://www.cnblogs.com/zychen/p/7384759.html
Copyright © 2020-2023  润新知