同時發布在我的個人部落格:以下是原文:
考慮乙個有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(n,m),沒有考慮錯排m個元素d(m)的問題,這裡用上面的兩種方法分別寫出**:輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c行資料,每行包含兩個整數n和m(1< m<=n<=20)
對於每個測試例項,請輸出一共有多少種發生這種情況的可能,每個例項的輸出佔一行。
22 2
3 2
#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 個不同元素的乙個錯排...