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;

}

posted @ 2011-08-11 21:10  ○o尐懶錨o  阅读(210)  评论(0编辑  收藏  举报