题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2049
错排公式的题目。。
第一步:从n个中取m个,有c(n, m)种取法
第二步:m个数的错排数
再用乘法定理得结果。。。
#include <stdio.h>
long long com(int n, int m)
{
double mul = 1;
int i, j;
for (i = n, j = 1; j <= m; j++, i--) {
mul = mul * i / j;
}
return (long long)mul;
}
int main(void)
{
int n, m, i, t;
long long num;
long long f[30] = {0, 0, 1};
for (i = 3; i <= 20; i++) {
f[i] = (i - 1) * (f[i-1] + f[i-2]);
}
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
num = com(n, m) * f[m];
printf("%I64d\n", num);
}
return 0;
}