http://acm.hdu.edu.cn/showproblem.php?pid=2068
错排公式:f(i) = (i - 1) * [f(i-1) + f(i-2)]。
//错排
#include <stdio.h>
int main()
{
double fac[26], staggered[26];
int i, n;
fac[0] = 1, fac[1] = 1, fac[2] = 2;
staggered[0] = 1, staggered[1] = 0, staggered[2] = 1;
for(i = 3; i < 26; i ++){
fac[i] = i*fac[i-1];
staggered[i] = (i-1)*(staggered[i-1]+staggered[i-2]);
// printf("fac[%d] = %.lf\n", i, fac[i]);
}
while(scanf("%d", &n)&&n){
double sum = 0;
for(i = 0; i <= n/2; i ++){
sum += fac[n]/fac[i]/fac[n-i]*staggered[i];
}
printf("%.lf\n", sum);
}
return 0;
}