排列组合 + 递推
先从n个人里面挑选m个人出来让他们找错新娘,这一共是有C(m,n)种情况
m个人找错新娘就是错排的问题,错了N多次,看了别人的思路才知道是这么回事,看来要当一个模型来记住了。
我们先让第一个新郎过来找,他找错一共有n-1中情况。
接着让第二个新郎过来找,他找错的情况分为两种:
1.他一定找到第一个新娘
2.他不找第一个新娘
对于第一种情况,有3,4,……,n n-2个新郎新娘错排。
对于第二种情况,有2,3,……,n n-1个新郎新娘错排。
所以m个人错排的情况共有(m-1)(f[m-1]+f[m-2])种
#include <stdio.h>
long long fact(int n) {
long long temp = 1;
int i;
for (i = 1; i <= n; ++ i)
temp *= i;
return temp;
}
int
main(int argc, char **argv) {
long long res[21];
int i, n, m;
res[1] = 0;
res[2] = 1;
for (i = 3; i < 21; ++ i) {
res[i] = (i - 1) * res[i - 1] + (i - 1) * res[i - 2];
}
int ncase;
scanf("%d", &ncase);
while (ncase--) {
scanf("%d%d", &n, &m);
printf("%lld\n", fact(n)/(fact(n - m) * fact(m)) * res[m]);
}
return 0;
}