#joi2006yoe. [joi2006yo_e]JOI 2006 予選 問題5
[joi2006yo_e]JOI 2006 予選 問題5
问题
考虑以下游戏。我们有从 到 的数字分别写在 张卡片上,共有 套卡片。将这 张卡片充分洗牌(即充分切牌),然后将每套 张卡片堆叠成一行。我们将从左到右依次称这 个堆(包含 张卡片的堆)为“第 堆”。
游戏从第 堆开始。首先抽出第一个堆顶的 张卡片(不将其放回原堆),如果抽出的卡片上写的数字为 ,则再抽出第 堆的堆顶 张卡片。以此类推,重复抽出卡片上所写的数字对应的堆顶的卡片,直到所有堆都没有卡片为止,这样就算成功。如果还有剩余的卡片,并且已经没有可以抽卡片的堆了,则算失败。
若在中途失败,则有两种选择:要么直接结束并宣告失败,要么将剩余的卡片堆保持原样(包括堆的编号),重新开始游戏。若选择重新开始游戏,则规定从剩余卡片中最左侧的堆开始抽卡片(即抽取该堆顶的卡片作为第一次抽取的卡片)。重新开始后,按照与之前相同的方法进行游戏,直到所有堆都没有卡片为止,这样算成功;如果还有剩余的卡片,并且已经没有可以抽卡片的堆了,则算失败。
假设游戏重新开始的次数最多为 次。注意, 只能是 或 。根据初始洗牌方式的不同,初始卡片排列也会有所不同。显然,由于洗牌充分,每种初始排列出现的概率都是一样的。有时可以在不重新开始的情况下成功,有时可以在重新开始后成功,也有可能重新开始一次却失败。我们希望计算在重新开始次数不超过 的情况下成功的概率 ,并将其表示成小数形式,输出至小数点后第 位。请编程实现此功能,并满足以下条件输出:
当取一个足够大的正整数 时, 将是一个整数。如果小数部分从某一位开始全是 ,也要输出这些连续的 。例如,若 ,若 ,则输出 ;若 ,则输出 。对于 的情况,也需要按照上述方式输出。例如,若 ,则输出 。例如 可以表示为循环小数 ,但在此情况下使用前者的表示方式。
输入的第一行包含四个整数 ,以空格作为分隔符。满足 ,, 是 或 ,。
输出时,按照指定的方式输出 ,并换行。
输入示例 1
2 1 0 5
输出示例 1
0.50000
输入示例 2
3 1 1 3
输出示例 2
0.833
输入示例 3
2 2 1 3
输出示例 3
1.000