错排问题 && 洛谷 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 }
原文地址:https://www.cnblogs.com/yinyuqin/p/11625305.html