hdu 2068 RPG的错排
http://acm.hdu.edu.cn/showproblem.php?pid=2068
这是一道错排题,不过有点变形,要把所以的你n/2的情况直接相加就可以了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
__int64 mm(int x,int y)
{
__int64 sum=1;
for(int i=x;i>=x-y+1;--i)
sum*=i;
for(int j=y;j>=2;--j)
sum/=j;
return sum;
}
int main()
{
__int64 a[26],max;
int n;
a[1]=0;a[2]=1;
for(int i=3;i<=25;++i)
a[i]=(i-1)*(a[i-1]+a[i-2]);
while(scanf("%d",&n),n)
{
max=0;
for(int i=2;i<=n/2;++i)
max+=mm(n,i)*a[i];//小于n/2的人的错排的和,即为所求
if(n==1||n==2) printf("1\n");
else
printf("%I64d\n",max+1);/*为啥+1呢?原来是错排公式的f[0]=1*/
}
return 0;
}