1682: 百步穿杨

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:5 解决:2

题目描述

  南岳隐士罗少侠一直崇拜着百步穿杨的养由基。他潜心修炼箭术。   在潜心修炼了 N 年之后,少侠想测试他已经到了几步穿杨的水平。他知道他现在的水平最多可能有 s 步穿杨(可能是 0 步穿杨到 s 步穿杨中的任意值)。水平为 p 步穿杨的意思为,在距离为 p 步及更近之处可以射穿杨柳叶子,而在距离为 p + 1 步及更远处就不行。   毋庸置疑,少侠拥有零步穿杨的能力,所以少侠不必也不会在 0 步远处测试他的能力。
  每次测试,如果少侠没能射中目标,箭就会飞的无影无踪;如果射中了目标,少侠就能捡回箭,继续用于测试。   最简单的办法就是从 1 步远处开始逐一测试,直到不能射中,但少侠想用最少的次数测出他的水平。如果少侠的箭足够多,他会使用传说中的“半步术”(也就是二分法)最快地达到目标,但是少侠现在一共只有 k 支箭,使用“半步术”可能会让他落入无箭可测的境地,于是他不得不换一种策略,比如在少侠只剩一支箭的时候,他只能从最近开始一步一步测,否则就有可能没法测出自己的能力。少侠是个聪明人,每次都能在最佳的位置测试他的能力,以使测试次数的期望值最小。现在就请你算一算这个最小测试次数的期望值。   提示:在测试之前,少侠认为自己的能力在 0 到 s 步之间(含 0 和 s 步)的各处是等可能的。

输入

  输入第一行为一个整数 C,表示下面共有 C 组数据。   接下来 C 行,每行两个整数s k(1 ≤ s ≤ 100,1 ≤ k ≤ 10),分别表示少侠已知最多可能具有s步穿杨的能力和当前可以用于测试的箭数。

输出

  输出 C 行,对应每对输入,输出少侠能达到的最小测试次数期望值,保留六位小数。

样例输入 复制

3
1 1
2 1
3 2

样例输出 复制

1.000000
1.666667
2.000000

提示

  数据 1:少侠需要在 1 步远处进行一次测试,以区分出他只有 0 步穿杨的能力还是有 1 步穿杨的能力。   数据 2:如果少侠只有 0 步穿杨的能力,则他需要在 1 步远处进行一次测试;如果具有少侠 1 步穿杨或 2 步穿杨的能力,他需要在 2 步远处再次进行测试。因此测试次数的期望值为 1/3 + 2/3 + 2/3 = 5/3。   数据 3:最佳策略为少侠先在 2 步远处测试一次,这时他至少还剩一支箭。再根据射中或射偏在 3 步远或 1 步远处进行第二次测试,并得到他的确切水平。