错排解释

一、定义:
错排问题,是组合数学中的问题之一。考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排。 n个元素的错排数记为D(n)。研究一个排列错排个数的问题,叫做错排问题或称为更列问题。

二、递推与通项公式:
当n个编号元素放在n个位置,元素编号与位置编号各不相同的方法数用D(n)表示,那么D(n-1)就表示n - 1个编号元素放在n - 1个编号位;

模拟一个问题 一共有n本书寻找全部不在一起的情况;

  1. 随便取一本书 m 把 m 取出来 选取一个除 m 以外的位置 那就是 n - 1 种

  2. 选种的位置记为 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));

下面有道例题
错排解释_第1张图片错排解释_第2张图片
代码贴上:

#include
#include
#include
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;
} 

你可能感兴趣的:(c++,算法)