n个有序的元素应有n!个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排,问这个排列有多少种
递归关系
为求其递推关系,分两步走:
第一步,考虑第n个元素,把它放在某一个位置,比如位置k,一共有n-1种放法;
第二步,考虑第k个元素,这时有两种情况:(1)把它放到位置n,那么对于除n以外的n-1个元素,由于第k个元素放到了位置n,所以剩下n-2个元素的错排即可,有D[n-2]种放法;(2)第k个元素不放到位置n,这时对于这n-1个元素的错排,有D[n-1]种放法。
根据乘法和加法法则,综上得到 D[n] = (n-1) * ( D[n-1] + D[n-2] )
#include <cstdio>
int ans[1005];
int main()
{
int n;
scanf("%d",&n);
D[0] = 1;D[1] = 0;
for (int i = 2; i <= n; i++)
{
D[i] = (i-1) * (D[i-1] + D[i-2]);
}
return 0;
}