考新郎
Time Limit: 1000 ms
Memory Limit: 32768 KiB
Problem Description
在一场盛大的集体婚礼中,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎",具体的操作是这样的:
首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;
然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.
最后,揭开盖头,如果找错了对象就要当众跪搓衣板...
看来做新郎也不是容易的事情...
假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C行数据,每行包含两个整数N和M(1 < M <= N <= 20)
Output
对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。
Sample Input
2 2 2 3 2
Sample Output
1 3
Hint
hdoj2049 有链接提示的题目请先去链接处提交程序,AC后提交到SDUTOJ中,以便查询存档。
01 | #include <iostream> |
02 | #include <algorithm> |
03 | using namespace std; |
04 | long long int cmn( int c, int x) |
05 | { |
06 | int i; |
07 | long long int b = 1; |
08 | for (i = c;i >= c-x+1;i--) |
09 | { |
10 | b = b * i; |
11 | } |
12 | return b; |
13 | } |
14 |
15 | long long int a( int t) |
16 | { |
17 | int i; |
18 | long long int q = 1; |
19 | for (i = 1;i <= t;i++) |
20 | { |
21 | q = q * i; |
22 | } |
23 | return q; |
24 | } |
25 |
26 | int main() |
27 | { |
28 | int i,n,c,m; |
29 | long long int b[1000],t1,t2,t3; |
30 | b[0] = 0; |
31 | b[1] = 0; |
32 | b[2] = 1; |
33 | for (i = 3; i <= 20;i++) |
34 | { |
35 | b[i] = (i - 1)*(b[i-1] + b[i - 2]); |
36 | } |
37 | cin>>n; |
38 | while (n--) |
39 | { |
40 | cin>>c>>m; |
41 | t1 = cmn(c,m); |
42 | t2 =a(m); |
43 | t3 = (t1/t2) * b[m]; |
44 | cout<<t3<<endl; |
45 | } |
46 | return 0; |
47 | } |