time limit: 1000 ms memory limit: 32768 kib
problem description
在一場盛大的集體婚禮中,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做"考新郎",具體的操作是這樣的:
首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排;
然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.
最後,揭開蓋頭,如果找錯了物件就要當眾跪搓衣板...
看來做新郎也不是容易的事情...
假設一共有n對新婚夫婦,其中有m個新郎找錯了新娘,求發生這種情況一共有多少種可能.
輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c行資料,每行包含兩個整數n和m(1 < m <= n <= 20)
對於每個測試例項,請輸出一共有多少種發生這種情況的可能,每個例項的輸出佔一行。
2
2 23 2
一:1
3
解題思路:
1.先進行組合,然後在對m個人進行錯排
2.從n個新郎中挑選出m個新郎
二:具體思路是 在n中挑m對的總數(利用排列組合知識得出)乘以m對挑選不同的總數
錯誤的挑選方法計算通過遞推公式可得 (遞推公式順著思路找規律可得)
f1=1
f2=1
f3=2
fn=(n-1)*f(n-1)*f(n-2)
三:解題思路:
一共有n對新婚夫婦,其中有m個新郎找錯了新娘。則有n-m個新郎位置正確
解題步驟分為兩步:
1、從n對夫婦中選中正確的n-m對進行組合,即:c(n,n-m)。
2、將m對夫婦進行錯排。兩步結果相乘即可。
四:分析:這個道題就是求n中有多少中m個數的錯排。
因此先找到n個新郎中m個錯一共有幾種,顯然是cmn=n!/(m!*(n-m)!)。即cmn=n!/m!/(n-m)!。
然後在求出m個數的錯排個數,遞推關係:f[n]=(n-1)*(f[n-1]+f[n-2])
詳細推導過程:
錯排的情況:
首先考慮,如果開始有n-1個新郎,並且這n-1個人都已經完成了錯排(有f(n-1)種可能),現在又來了乙個人,那麼後來的第n個人可以通過用自己的新娘去和那n-1個人中的任意乙個交換,來實現n個人都錯排。這種情況有(n-1)*f[n-1]種可能;
另外,如果開始的n-1個人不是都錯排,那麼要想使第n個人過來與其中乙個交換後實現錯排的話就必須滿足兩個條件:
1.那n-1個人中只有乙個人選到了自己的新娘,也就是說有n-2個人都已經錯排了。
2.第n個人必須和那個選到自己新娘的人去交換,但那個選到自己新娘的人可以是n-1個人中的任意乙個。這種情況有(n-1)*f[n-2]種可能。
其他情況都不能滿足n個人錯排。
因此遞推關係:f[n]=(n-1)*(f[n-1]+f[n-2])。
#include #include #include int f(int, int);
long long int a[25];
int main()
scanf("%d", &c);
while(c--)
return 0;
}int f(int m, int n)
//計算 n 的階乘
for(i = 1; i <= m; i++)
//計算 m 的階乘
if(n == m) c = 1;
else
//計算 n - m 的階乘
}sum = a / (b * c);
}return sum;
}
考新郎的C語言實現
題目內容 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開...
HDU 2049 考新郎 遞推 錯排
problem description 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並...
不容易系列之 4 考新郎(遞推)
問題描述 國慶期間,省城hz剛剛舉行了一場盛大的集體婚禮,為了使婚禮進行的豐富一些,司儀臨時想出了有乙個有意思的節目,叫做 考新郎 具體的操作是這樣的 首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排 然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.最後,揭開...