HDU2048

作者: 费曼JW | 来源:发表于2019-05-16 00:32 被阅读0次

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2048

    思路:
    假设已经错排了n-1个人,第n个人拿着自己的字条,那么第n个人与前n-1个人其中一个交换即全部错排,即(n-1)an(n-1)种方法;如果前n-1人中,有一个人拿着自己的字条,这个人和第n个人交换字条即全部错排,即(n-1)an(n-2)种方法。(an(n)为错排方法个数)

    综上:an(n)=(n-1)*[an(n-1)+an(n-2)]

    代码:

    #include<stdio.h>
    
    int main(void)
    {
        int n, i, T;
        double an[21] = { 0,0,1 };
        long long sum[21] = {0,1,2 };
        for (i = 3; i <= 20; i++)
        {
            an[i] = (i - 1) * (an[i - 1] + an[i - 2]);
            sum[i] = sum[i-1]*i;
        }
        scanf("%d", &T);
        while (T--)
        {
            scanf("%d", &n);
            printf("%.2f%%\n", (an[n] / sum[n]) * 100);
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:HDU2048

          本文链接:https://www.haomeiwen.com/subject/cdivaqtx.html