错排解释

一、定义:
错排问题,是组合数学中的问题之一。考虑一个有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));

下面有道例题
在这里插入图片描述在这里插入图片描述
代码贴上:

#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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值