博客目录
原题传送门(vjudge)
原题传送门(杭电原题)
Let’s talking about something of eating a pocky. Here is a Decorer Pocky, with colorful decorative stripes in the coating, of length L.
While the length of remaining pocky is longer than d, we perform the following procedure. We break the pocky at any point on it in an equal possibility and this will divide the remaining pocky into two parts. Take the left part and eat it. When it is not longer than d, we do not repeat this procedure.
Now we want to know the expected number of times we should repeat the procedure above. Round it to 6 decimal places behind the decimal point.
InputThe first line of input contains an integer N which is the number of test cases. Each of the N lines contains two float-numbers L and d respectively with at most 5 decimal places behind the decimal point where 1 ≤ d, L ≤ 150.
OutputFor each test case, output the expected number of times rounded to 6 decimal places behind the decimal point in a line.Sample Input
6
1.0 1.0
2.0 1.0
4.0 1.0
8.0 1.0
16.0 1.0
7.00 3.00
Sample Output
0.000000
1.693147
2.386294
3.079442
3.772589
1.847298
一根面条横着放,等概率地从中选取一个点,吃掉左边部分,然后再选再吃。直到剩下的部分小于等于b就停止,问吃的次数的期望。
实战的方法: 重现赛时根据样例猜公式,一看小数位数跟lnx有关,凑一凑公式就出来了。
正儿八经的做法: 事后查资料推公式:
网上为数不多的题解都是猜出来的公式,复习了一下概率论自己推导了好久都没弄出来,直到看到这个 传送门 大神的博客,然后现自己总结一下:
根据概率论的知识:期望=∑(子事件发生的概率*子事件贡献的期望) 。而对于连续模型来讲,求和就是积分。
设长度为x的面条,所期望的次数为f(x),画个t轴:0———b————————x ----->t的面条(凑合看吧,其中t为坐标)
当x<=b(我也忘了有没有等号了,自己去读题吧这里对公式没影响)。f(x)=0(长度小于等于n时一次也不用吃就停下了)
当x>b时,设t为0~x上的坐标值,表示吃掉t~x上的面条,自然剩下的面条就是0~t,即吃掉剩下的面条次数期望为f(t)
然后高等数学上的知识:对于dt表示很小的线元,点落到dt上的概率为dt/x,也就是线元长度/总长度。dt上贡献的期望为(因为dt很小可以看成一个点,高等数学的知识):从0到dt的长度为t,所以吃掉右边的剩下左边的长度为t,所以期望为f(t)。
然后将b~a上所有的线元dt贡献的期望加起来(即积分):∫(b到x) f(t)*(dt/x),x与积分无关可以提出来写到积分号外面。
接下来就是求解f(x)了,
两边乘一个x,然后方程两边对x求导,积分号正好是一个原函数形式,一求导就把积分号去掉了,就变成了一个一阶微分方程,然后解方程。(早就忘了微分方程咋解了,要记得考虑+常数c)
等式两边直接求导,方程左边暂时变为导数,着重处理右边:
常数求导变为0,分数用求导公式,求导后分子上依然有积分符号(请大家自行笔算一下,就不花心思贴图了),积分符号还存在,我们利用原始的式子处理积分符号:将这个式子解出来积分符号,然后代入上求导后的式子,消掉积分符号之后,发现也正好可以消掉等式右边的跟f(x)有关的部分,最终得出f '(x)=
然后根据不定积分:f(x)=lnx+c
找个特解(本题跟b跟n都有关的特例,很显然就是n=b的情况) f(d) = ln(d) + C = 1,c=1-ln(d),然后就把c求出来了。
最终:
解毕。
照着公式一写就过了,记得考虑n<=d的情况和保留的小数位数,不想去翻之前的代码了。
当n>b时
ln(n)-ln(b)
当n<=b时
0.000000