HDU 2049不容易系列之(4)——考新郎

首先得明白錯位排列的遞推公式,有興趣的可以看我下下面篇博客
HDU 2048 關於錯位排列

不容易系列之(4)——考新郎
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 61564 Accepted Submission(s): 22401

Problem Description
國慶期間,省城HZ剛剛舉行了一場盛大的集體婚禮,爲了使婚禮進行的豐富一些,司儀臨時想出了有一個有意思的節目,叫做"考新郎",具體的操作是這樣的:

首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排;
然後,讓各位新郎尋找自己的新娘.每人只准找一個,並且不允許多人找一個.
最後,揭開蓋頭,如果找錯了對象就要當衆跪搓衣板…

看來做新郎也不是容易的事情…

假設一共有N對新婚夫婦,其中有M個新郎找錯了新娘,求發生這種情況一共有多少種可能.

Input
輸入數據的第一行是一個整數C,表示測試實例的個數,然後是C行數據,每行包含兩個整數N和M(1<M<=N<=20)。

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

Sample Input
2
2 2
3 2

Sample Output
1
3

其實這道題說不好理解也確實不好理解,說好理解也特別好理解

關鍵是弄清楚題目的意思
假如 1 2 3 位新娘 ,理論上有1m,2m,3m爲新郎
假如一開始是1m和2m新郎找新娘
有三種情況
1 2 3
first 1m 2m
second 2m 1m
third 2m 1m
既然1m和2m,有三種情況,那1m和3m,2m和3m都有三種
不是應該9種情況嗎?

其實這是因爲沒有明白題目意思
假設一共有N對新婚夫婦,其中有M個新郎找錯了新娘,求發生這種情況一共有多少種可能.

意思是在N個新郎在找N個新娘的過程中,有多少種情況是N個新郎中有M個新郎找錯新娘
既然N個新郎中有M個新郎找錯啦新娘,意味着着M個新郎和新娘是錯排的
那麼總數爲 CMN=((N!)/(M!*(N-M)!) * 錯排數D(M)

#include<iostream>
using namespace std;

long long fun(int t)
{
	if(t<=1)
		return 1;
	else
		return t*fun(t-1);
}
int main()
{
	int c;
	cin>>c;
	long long f[22];
	f[1]=0;
	f[2]=1;
	int i;
	for(i=3;i<21;i++)
		f[i]=(i-1)*(f[i-1]+f[i-2]);
	while(c--)
	{
		int n,m;
		cin>>n>>m;
		cout<<(fun(n)/fun(m)/fun(n-m)*f[m])<<endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章