錯排公式的推導及應用

2021-08-15 11:52:37 字數 1606 閱讀 6628

同時發布在我的個人部落格:

以下是原文:

考慮乙個有n個元素的排列,若乙個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱為原排列的乙個錯排,n個元素的錯排記為d(n)。下面就是求出d(n)為多少中排列。

首先我們拿第乙個元素的放置來理解一下這個過程:把元素1放在除自己原來的位置以外的位置,共有(n-1)種,假設第乙個元素被放在了第k個元素的位置上,對第k個元素而言就有兩種情況要討論了,第一種,它放在非第乙個位置上,所以對於接下來的排列就相當於是n-1個元素的錯排,即d(n-1);第二種,它就放在第1個元素的位置上,所以排列d(n)中有兩個元素已經找到位置了,那麼接下來就只需要考慮n-2個元素的錯排,即d(n-2)。由此,我們就可以寫出遞推式對於d(n)都有d(n)=(n-1)*(d(n-1)+d(n-2))【特殊的情況 d(1)=0, d(2)=1】

下面通過這個遞推關係進行推導:

為了運算方便,我們設d(n)=n!n(n),則有:

n!n(n) = (n-1)(n-2)!n(n-2) + (n-1)(n-1)!n(n-1); 對兩邊同時除以(n-1)!,可得:

nn(n) = n(n-2)+(n-1)*n(n-1),移項:

n(n) - n(n-1) = (n(n-2) - n(n-1))/n = -(1/n)(n(n-1) - n(n-2)),所以,由此可以推出

n(n-1) - n(n-2) = -(1/(n-1))(n(n-2) - n(n-3))

……n(2) - n(1) = 1/2;

由此,將每個式子相加得到:n(n) - n(1) = (1/2! - 1/3! + 1/4! - ……+((-1)^(n-1))/(n-1)! + (-1)^n/n!)

由於n(1) = 0,所以n(n) = (1/2! - 1/3! + 1/4! - …… +((-1)^(n-1))/(n-1)! + (-1)^n/n!),於是可以得到:

錯排公式d(n) = n!(1/2! - 1/3! + 1/4! - …… +((-1)^(n-1))/(n-1)! + (-1)^n/n!)

在一場盛大的集體婚禮中,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做"考新郎",具體的操作是這樣的:

輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c行資料,每行包含兩個整數n和m(1< m<=n<=20)

對於每個測試例項,請輸出一共有多少種發生這種情況的可能,每個例項的輸出佔一行。

22 2

3 2

最開始做著題的時候就直接求解排列組合c(n,m),沒有考慮錯排m個元素d(m)的問題,這裡用上面的兩種方法分別寫出**:

#include #include #include using namespace std;

long long f[22];

void init()//錯排

return ;

} int c(int x, int y)

sum=a/b;

return sum;

}int main()

int main()

cout《本文內容參考自:

錯排的遞推公式及推導

嘻嘻 剛用電腦的photoshop做出來 f n n 1 f n 2 f n 1 顏書先生 裝錯信封問題 的數學模型與求解 一文 見 數學通報 2000 年第 6 期 p.35 給出了該經典問題的乙個模型和求解公式 編號為 1 2 n 的 n 個元素排成一列,若每個元素所處位置的序號都與它的編號不同...

錯排的遞推公式及推導

錯排遞推公式 f n n 1 f n 2 f n 1 顏書先生 裝錯信封問題 的數學模型與求解 一文 見 數學通報 2000 年第 6 期 p.35 給出了該經典問題的乙個模型和求解公式 編號為 1 2 n 的 n 個元素排成一列,若每個元素所處位置的序號都與它的編號不同,則稱這個排列為 n 個不同...

錯排的遞推公式及推導

f n n 1 f n 2 f n 1 顏書先生 裝錯信封問題 的數學模型與求解 一文 見 數學通報 2000 年第 6 期 p.35 給出了該經典問題的乙個模型和求解公式 編號為 1 2 n 的 n 個元素排成一列,若每個元素所處位置的序號都與它的編號不同,則稱這個排列為 n 個不同元素的乙個錯排...