转自:随心所欲
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4061
题目大意:
总共有m堆牌,每堆有张数字为的牌,现在随机分配牌所在的堆,使每堆牌数保持不变,然后从第一堆取一张牌,数字为,则到第j堆取一张牌,然后循环如此做,直到下一堆要取的牌堆为空,则结束游戏,求游戏结束时所有牌堆为空的概率
思路:
分析:假设取的牌顺序是一个序列,那么这种序列在末尾为时是和取牌序列一一对应的,且是符合“游戏结束时牌恰好被取完”的一种情况。
简证:1、在序列中,任一数$ i j$ 是必然要放在第 i 堆里的。而值为$ i a[i]$个,所以在 $i a[i]a[i] i $堆,符合题目约束条件。
2、在序列中,由于游戏是从第一堆开始的,所以第一个数虽然没有前驱,但是他是放在第 堆的。所以如果 不为最后一个数,那么第一堆中必然有个数了,不行。
3、序列中的最后一个数 记 i ,如果不为 ,那么值 就只有个后继了。
4、结合2、3,易知只有最后一个数为$ 1$ ,堆容量a[i]才会都符合。才能根据此序列构造一种符合的分堆及取牌(题目原意是随机取的)情况,即一一对应。
所以至此,题目转变为个数的全排列,其中最后一个数为1的概率是多少。先从个里取一个,有种,然后剩下的个数全排列有种,所以总共符合有种。而个数全排列有种。所以概率为。而。
代码:
1 | #include<stdio.h> |