hdu_problem_2049_不容易系列之(4)——考新郎
阿新 • • 發佈:2019-01-13
N個人裡面有M個人選錯了,可以看成從N個人裡面選M個人(組合數公式C(N,M),可以參考楊輝三角)然後M個人對應的位置都錯了(可以參考problem_2048)
/*
*
*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
*
*
*Author
*lcy
*
*
*Source
*遞推求解專題練習(For Beginner)
*
*
*Recommend
*lcy
*
*/
#include<iostream>
#define MAX_NUM 20
using namespace std;
long long num_zuhe[MAX_NUM] = { 1,1,2 };// m個數字對應的數互不相同的情況
long long triangle_zuhe[MAX_NUM][MAX_NUM];// 組合數
// 打表
void func_1() {
for (int i = 3; i < MAX_NUM; i++) {
num_zuhe[i] = i * (num_zuhe[i - 1] + num_zuhe[i - 2]);
}
}
void func_2 () {
for (int i = 0; i < MAX_NUM; i++) {
triangle_zuhe[i][i] = 1;
triangle_zuhe[i][0] = 1;
}
for (int i = 0; i < MAX_NUM; i++) {
for (int j = 1; j <= i - 1; j++) {
triangle_zuhe[i][j] = triangle_zuhe[i - 1][j - 1] + triangle_zuhe[i - 1][j];
}
}
}
int main() {
int C, n, m;
cin >> C;
func_1();
func_2();
for (int i = 0; i < C; i++) {
cin >> n >> m;
if (m == 1) { cout << 0 << endl; continue; }
cout << triangle_zuhe[n][m] * num_zuhe[m - 1] << endl;
}
system("pause");
return 0;
}