一道裸的错排问题
百度百科上这样说
就是对于一个排列,每一个数都不在正确的位置上的方案数。n 个元素的错排数记为 D(n)。
D(n)=(n−1)∗(D(n−2)+D(n−1))
对于第n个数,放在k位置上。
而第k个数有两种情况:
所以对于每个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。
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