#joi2006yoe. [joi2006yo_e]JOI 2006 予選 問題5

[joi2006yo_e]JOI 2006 予選 問題5

问题

考虑以下游戏。我们有从 11nn 的数字分别写在 nn 张卡片上,共有 kk 套卡片。将这 knkn 张卡片充分洗牌(即充分切牌),然后将每套 kk 张卡片堆叠成一行。我们将从左到右依次称这 nn 个堆(包含 kk 张卡片的堆)为“第 ii 堆”。

2006-yo-t5-fig_base.png

游戏从第 11 堆开始。首先抽出第一个堆顶的 11 张卡片(不将其放回原堆),如果抽出的卡片上写的数字为 ii,则再抽出第 ii 堆的堆顶 11 张卡片。以此类推,重复抽出卡片上所写的数字对应的堆顶的卡片,直到所有堆都没有卡片为止,这样就算成功。如果还有剩余的卡片,并且已经没有可以抽卡片的堆了,则算失败。

若在中途失败,则有两种选择:要么直接结束并宣告失败,要么将剩余的卡片堆保持原样(包括堆的编号),重新开始游戏。若选择重新开始游戏,则规定从剩余卡片中最左侧的堆开始抽卡片(即抽取该堆顶的卡片作为第一次抽取的卡片)。重新开始后,按照与之前相同的方法进行游戏,直到所有堆都没有卡片为止,这样算成功;如果还有剩余的卡片,并且已经没有可以抽卡片的堆了,则算失败。

2006-yo-t5-fig_sample.png

假设游戏重新开始的次数最多为 mm 次。注意,mm 只能是 0011。根据初始洗牌方式的不同,初始卡片排列也会有所不同。显然,由于洗牌充分,每种初始排列出现的概率都是一样的。有时可以在不重新开始的情况下成功,有时可以在重新开始后成功,也有可能重新开始一次却失败。我们希望计算在重新开始次数不超过 mm 的情况下成功的概率 pp,并将其表示成小数形式,输出至小数点后第 rr 位。请编程实现此功能,并满足以下条件输出:

当取一个足够大的正整数 KK 时,p×10Kp \times 10^K 将是一个整数。如果小数部分从某一位开始全是 00,也要输出这些连续的 00。例如,若 p=3/8=0.375p = 3/8 = 0.375,若 r=5r = 5,则输出 0.375000.37500;若 r=2r = 2,则输出 0.370.37。对于 p=1.0p = 1.0 的情况,也需要按照上述方式输出。例如,若 r=3r = 3,则输出 1.0001.000。例如 0.150000cdots0.150000\\cdots 可以表示为循环小数 0.1499999cdots0.1499999\\cdots,但在此情况下使用前者的表示方式。

输入的第一行包含四个整数 n,k,m,rn, k, m, r,以空格作为分隔符。满足 1n10,0001 \le n \le 10,0001k1001 \le k \le 100mm00111r10,0001 \le r \le 10,000

输出时,按照指定的方式输出 pp,并换行。


输入示例 1

2 1 0 5

输出示例 1

0.50000

输入示例 2

3 1 1 3

输出示例 2

0.833

输入示例 3

2 2 1 3

输出示例 3

1.000