hdu2048 神、上帝以及老天爷

题意:输入n个人,n个人写下自己名字,问n个人完全抽不到自己姓名的概率是多少。
事件分母就是n的全排列,分子考虑n张票错排的问题,看似概率问题,可以转换成递推,考虑前面n-1个人拿的已是错排,第n个人拿的是对的,他随便和其他n-1的人交换一下,就满足就是(i-1)*f(i-1);
还有一种可能是,前面n-1个人有一个人是对的,第n个人也是对的,和他一交换也满足n错排,就是(i-1)*f(n-2);
递推式:f(n)=(i-1)*(f(i-1)+f(i-2))

#include<cstdio>
#include<cstring>
long long sum[25],ssum[25];
int main()
{
    sum[1]=1,sum[2]=2,sum[3]=6,ssum[1]=0,ssum[1]=0,ssum[2]=1;ssum[3]=2;
    for(int i=4;i<=20;i++)
    {
        sum[i]=i*sum[i-1];
        ssum[i]=(i-1)*(ssum[i-1]+ssum[i-2]);
    }
    int T;scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        printf("%.2lf%%\n",100.0*(double)ssum[n]/(double)sum[n]);
    }
}

你可能感兴趣的:(hdu2048 神、上帝以及老天爷)