• 错排问题 && 洛谷 P1595 信封问题


    传送门


    一道裸的错排问题

    错排问题

    百度百科上这样

    就是对于一个排列,每一个数都不在正确的位置上的方案数。n 个元素的错排数记为 D(n)。

    公式

    D(n)=(n−1)∗(D(n−2)+D(n−1))

    推出公式(感性)

    对于第n个数,放在k位置上。

    而第k个数有两种情况:

    • 当第k个数放到n位置时,相当于把k和n交换了位置,对剩下的n-2个数没有任何影响,所以方案数为D(n-2)。
    • 当第k个数不放到n位置时,相当于k由原来的不能放在k位置变成了不能放在n位置,对k和剩下的n-2个数即这n-1个数都没有影响,所以方案数为D(n-1)。

    所以对于每个k,都有D(n-1)+D(n-2)种排法。而k有n-1种选择,所以要乘上n-1,最终得出公式D(n)=(n-1)*(D(n-1)+D(n-2))。

    其中,D(1)初始化为0,D(2)初始化为1。

    AC代码

     1 #include<iostream>
     2 using namespace std;
     3 long long ans[25];
     4 int main()
     5 {
     6     int n;
     7     cin>>n;
     8     ans[1]=0;
     9     ans[2]=1;
    10     for(int i=3;i<=n;i++) ans[i]=(i-1)*(ans[i-1]+ans[i-2]);
    11     cout<<ans[n];
    12     return 0;
    13 }
  • 相关阅读:
    XStream
    Tomcat权威指南-读书摘要系列2
    《人性的弱点》
    HttpClient
    Spring整合Mybatis
    Tomcat权威指南-读书摘要系列1
    MT【88】抽象函数
    MT【87】迭代画图
    MT【86】两个绝对值之和最大
    MT【85】正整数系数
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/11625305.html
Copyright © 2020-2023  润新知