#P5147. 随机数生成器

随机数生成器

题目描述

HKE最近编写了一个函数 rand(l,r)\text{rand}(l,r),其中 l,rl,r 为正整数且 lrl \le r。这个函数会等概率返回区间 [l,r][l,r] 中任意一个正整数。然后,他又编写了一个函数:

int work(int x){
    if(x==1) return 0;
    else return work(rand(1,x))+1;
}

这段代码用pascal写起来就是:

function work(x:integer):integer;
begin
    if x=1 then exit(0);
    else exit(work(rand(1,x))+1);
end;

现在给定一个正整数 nn,请问 work(n)\text{work}(n) 的返回值的期望值是多少?

期望的定义:假设 work(n)\text{work}(n) 返回的所有可能的值为 x1,x2,,xkx_1,x_2,\dots ,x_k,它们出现的概率分别为 p1,p2,,pkp_1,p_2,\dots,p_k,则期望为:

E=i=1kxipi\mathbb{E}=\sum_{i=1}^{k}x_i p_i

输入格式

一个正整数 nn

输出格式

一个实数,表示 work(n)\text{work}(n) 的期望值。保留 55 位小数。

2
2.00000
3
2.50000
100000
13.09014

提示

【样例 11 解释】
work(2)\text{work}(2)1/21/2 的概率返回 11,有 1/41/4 的概率返回 22,有 1/81/8 的概率返回 33 ……
则期望为 1/2+2/4+3/8+=21/2+2/4+3/8+ \dots =2

【数据范围】
对于 30%30\% 的数据,n9n \le 9
对于 50%50\% 的数据,n1000n \le 1000
对于 70%70\% 的数据,n1000000n \le 1000000
对于 100%100\% 的数据,1n<2311\le n < 2^{31}