题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2068
排列组合 + 错排公式。。。。
#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;
}
long long array[30] = {1, 0, 1};
int main(void)
{
int n, i;
long long first;
for (i = 3; i <= 25; i++)
array[i] = (i - 1) * (array[i-1] + array[i-2]);
while (scanf("%d", &n) != EOF && n) {
first = 0;
for (i = 0; i <= n / 2; i++) {
first += com(n, i) * array[i];
}
printf("%I64d\n", first);
}
return 0;
}