1. 程式人生 > >hdu_problem_2049_不容易系列之(4)——考新郎

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

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; }