國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做"考新郎",具體的操作是這樣的:
首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排;
然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.
最後,揭開蓋頭,如果找錯了物件就要當眾跪搓衣板…
看來做新郎也不是容易的事情…
假設一共有n對新婚夫婦,其中有m個新郎找錯了新娘,求發生這種情況一共有多少種可能.
input
輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c行資料,每行包含兩個整數n和m(1output
對於每個測試例項,請輸出一共有多少種發生這種情況的可能,每個例項的輸出佔一行。
sample input
22 2
3 2sample output13
題解:首先明白錯排的定義:一段序列中一共有n個元素,那麼可知這些元素一共有n!種排列方法。假如在進行排列時,原來所有的元素都不在原來的位置,那麼稱這個排列為錯排。而錯排數所指的就是在一段有n個元素的序列中,有多少種排列方式是錯排。
遞迴關係:d(n)=(n−1)(d(n−1)+d(n−2))特別地有d(1)=0,d(2)=1;
錯排公式:d(n)=(n!)[(−1)0/0!+(−1)1/(1!)+(−1)2/(2!)+(−1)3/(3!)+…+(−1)n/(n!)];
其中n!=n∗(n−1)∗(n−2)∗…3∗2∗1特別地有0!=11!=1
遞推思想:
一共分為兩步
第一步:
錯排(不能選擇自己本來就在的位置)第乙個元素,在n個位置中任選乙個位置,有 n-1 種選法。
第二步:
錯排其餘n-1個元素,也是需要分情況和種類的。因為這需要看第一步的結果,如果第乙個元素落在第k個位置上,第二步就需要把k號元素進行錯排,k號元素錯排位置的不同將導致不同的情況會發生:
①.假設k號元素正好落在了第乙個元素的位置,那麼就可以將第乙個元素和第k個元素完全剔除出去,因為相當於只是他們兩者互換了位置,其他元素暫時還沒有發生變動。留下來的n-2元素進行錯排的話,那麼我們就可以得到了d(n-2)種 的錯排方式。
②.若k號元素不排到第乙個元素的位置,我們可以暫時將現在排在k號位置的第乙個元素剔除出去,生下來的就只包含k號元素和原來n-2個的元素了。這時,我們可以將原來的第乙個元素的位置看做是現在k號元素的原本位置,因為k號元素不能夠放在原來的位置上,所以就相當於是原來的n-2個元素和k共計n-1個元素進行完全的錯排。那麼一共就有d(n-1)種方法。
綜上所述:第二步得到d(n-1)+d(n-2)種方法,第一步是n-1種,由於是分步進行,所以結果為(n-1)*[d(n-1)+d(n-2)]種方法。
在本題中 在n對新人裡面挑出m對新人來錯排,那麼實際讓我們求得就是挑出m對新人的方法乘以m對新人的錯排方法。就是下面這個公式。
cmn∗(n−1)∗[d(n−1)+d(n−2)]
ac**
#include typedef long long ll;
using namespace std;
ll factorial(int n, int m) //求組合數
int main()
; int i = 3;
int temp;
cin >> t;
while(t--)
for( ; i <= m; i++) //錯排
a[i] = (i-1)*(a[i-1]+a[i-2]);
cout << factorial(n,m)*a[m] << endl;//輸出錯排*組合數
}}
不容易系列之 4 考新郎
題目描述 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開...
不容易系列之 4 考新郎
國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開蓋頭,如果...
不容易系列之 4 考新郎
國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開蓋頭,如果...