杭電oj-神、上帝以及老天爺-【題解】附錯排公式解析

題目鏈接:神、上帝以及老天爺

AC代碼:

#include<iostream>
#include<iomanip>
using namespace std;
typedef long long ll;
double fun (int m)
{
	ll a[25],b[25];
	a[0]=0;a[1]=0;a[2]=1;a[3]=2;
	for(int i=4;i<25;i++)
	a[i]=(i-1)*(a[i-1]+a[i-2]);
	b[0]=0;b[1]=1;
	for(int i=2;i<25;i++)
	b[i]=b[i-1]*i;
	return (double)a[m]/b[m];
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int m;
		cin>>m;
		double sum;
		sum=fun(m)*100;
		cout<<fixed<<showpoint<<setprecision(2);
		cout<<sum<<"%"<<endl;
	}
	return 0;
}
   

 錯排:

n個有序的元素應有n!個不同的排列,如若一個排列使得所有的元素不在原來的位置上,則稱這個排列爲錯排;有的叫重排。

如,1 2的錯排是唯一的,即2 1。1 2 3的錯排有31 2,2 3 1。這二者可以看作是1 2錯排,3分別與1、2換位而得的。

目錄

  1. 基本信息
  2. 錯排公式
  3. ▪ 遞推關係

基本信息

錯排問題是組合數學發展史上的一個重要問題,錯排數也是一項重要的數。令

的一個錯排,如果每個元素都不在其對應下標的位置上,即

,那麼這種排列稱爲錯位排列,或錯排、重排(Derangement)。

我們從分析1 2 3 4的錯排開始:

1 2 3 4的錯排有:

4 3 2 1,4 1 2 3,4 3 1 2,

3 4 1 2,3 4 2 1,2 4 1 3,

2 1 4 3,3 1 4 2,2 3 4 1。

第一列是4分別與123互換位置,其餘兩個元素錯排。

1 2 3 4->4 3 2 1,

1 2 3 4->3 4 1 2,

1 2 3 4-> 2 1 4 3

第2列是4分別與312(123的一個錯排)的每一個數互換

3 1 2 4->4 1 2 3,

3 1 2 4->3 4 2 1,

3 1 2 4->3 1 4 2

第三列則是由另一個錯排231和4換位而得到

2 3 1 4->4 3 1 2,

2 3 1 4->2 4 1 3,

2 3 1 4->2 3 4 1

上面的分析結果,實際上是給出一種產生錯排的結果。

錯排公式

遞推關係

爲求其遞推關係,分兩步走:

第一步,考慮第n個元素,把它放在某一個位置,比如位置k,一共有n-1种放法;

第二步,考慮第k個元素,這時有兩種情況:(1)把它放到位置n,那麼對於除n以外的n-1個元素,由於第k個元素放到了位置n,所以剩下n-2個元素的錯排即可,有

种放法;(2)第k個元素不放到位置n,這時對於這n-1個元素的錯排,有

种放法。

根據乘法和加法法則,綜上得到

特殊地,

。此外,存在

因此,

通項公式求解

下面利用遞推關係證明通項公式,可利用母函數方法,也可利用容斥原理。首先基於母函數方法進行證明,令

有遞推關係得

因此

而1/(1-x)可以替換成無窮級數(無窮遞縮等比數列)

故(由對應次數項係數相等)

此外,也可基於容斥原理進行證明。設

爲數i在第i爲上的全體排列,

。則有

故每個元素都不在原來的位置上的排列數爲

 下面是一個實例解析:

徹底搞懂錯排公式

希望可以幫到你!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章