一、定义:
错排问题,是组合数学中的问题之一。考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排。 n个元素的错排数记为D(n)。研究一个排列错排个数的问题,叫做错排问题或称为更列问题。
二、递推与通项公式:
当n个编号元素放在n个位置,元素编号与位置编号各不相同的方法数用D(n)表示,那么D(n-1)就表示n - 1个编号元素放在n - 1个编号位;
模拟一个问题 一共有n本书寻找全部不在一起的情况;
-
随便取一本书 m 把 m 取出来 选取一个除 m 以外的位置 那就是 n - 1 种
-
选种的位置记为 K 把 K 取出来 有两种情形 :
一. 把 K放到 m 位置上 那么剩下 n - 2 本书还是原来的情形 重复 以上操作就是(n - 1) * D(n - 2);
二. 把K放到 除 m 和 K位置上 剩下的 n - 1 本书 还没放 重复以上操作 就是 (n - 1) * D(n - 1);
总的情况就是 D(n) = (n - 1)*((D(n - 2) + D(n - 1));
下面有道例题
代码贴上:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
int t;
cin>>t;
long long a[40] = {0};
a[1] = 0;
a[2] = 1;
long long c[40] = {0};
c[0] = c[1] = 1; c[2] = 2;
for(int i = 3; i <= 20; i++){
a[i] = (i - 1) * (a[i - 1] + a[i - 2]);
c[i] = i * c[i - 1];
}
while(t--){
int n,m;
cin>>n>>m;
cout<<1ll * a[m] * (c[n] / c[m] / c[n-m])<<endl;
}
return 0;
}