1.定义
n个有序的元素应有n!个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排。
(没错,抄的百度百科)
2.公式
2.1 递推公式
D1=0;D2=1;
Dn=(n−1)(Dn−1+Dn−2)(n≥2)
2.2 通项公式
Dn
2.3证明
不会证……推荐某谷P1595信封问题的第一篇题解写的很好,可以去看看。(我不知道人家给不给转啊……就这样吧)
3.例题
luoguP1595信封问题
经典错排问题,递推解决
#include<bits/stdc++.h>
using namespace std;
long long n,f[22];//开 long long
int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-') f=-1; ch=getchar();}
while(ch<='9'&&ch>='0') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int main(){
n=read();
f[0]=0;f[1]=0;f[2]=1;
for(int i=3;i<=n;i++) f[i]=(i-1)*(f[i-1]+f[i-2]);
printf("%lld\n",f[n]);
return 0;
}