天天看點

1129. 考新郎

單點時限: 2.0 sec

記憶體限制: 256 MB

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

首先,給每位新娘打扮得幾乎一模一樣,并蓋上大大的紅蓋頭随機坐成一排;

然後,讓各位新郎尋找自己的新娘。每人隻準找一個,并且不允許多人找一個。

最後,揭開蓋頭,如果找錯了對象就要當衆跪搓衣闆……

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

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

輸入格式

輸入資料的第一行是一個整數 C, 表示測試執行個體的個數,然後是 C 行資料,每行包含兩個整數 N 和 M (1<M≤N≤20)。

輸出格式

對于每個測試執行個體,請輸出一共有多少種發生這種情況的可能,每個執行個體的輸出占一行。

樣例

input

2

2 2

3 2

output

1

3

全錯排參見

/*
思路:先從n中選擇出m的個數就是組合C(n,m)個,m個全排錯的個數公式f[m]=(m-1)*(f[m-2]+f[m-1])
*/
#include<iostream>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
ll fun(int n,int m) {
	ll ans=1;
	for(int i = 1; i <= m; i++)
		ans=ans*(n-i+1)/i;
	return ans;
}
int main() {
	int t;
	cin>>t;
	long long f[21];
	f[0]=0;
	f[1]=0;
	f[2]=1;
	for(int i = 3; i < 21; i++)
		f[i]=(f[i-1]+f[i-2])*(i-1); 
	for(int i = 0; i < t; i++) {
		int n,m;
		cin>>n>>m;
		ll ans=0;
		ans=f[m]*fun(n,m);
		cout<<ans<<endl;
	}
	return 0;
}

           

繼續閱讀