首先得明白錯位排列的遞推公式,有興趣的可以看我下下面篇博客
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;
}