考虑最后的期望值会是多少,设 f(x) 表示 n=x 时的期望值,那么考虑 f(x) 如何得到。我们考虑其为 f(x−1) 多添加 x 得到,那么计算 x 的贡献。显然除非 x 在最后一个,否则不会有任何贡献,x 生成在 n 个位置的概率是相等的,那么有
f(x)=n(n−1)×f(x−1)+f(x−1)+1=f(x−1)+n1
显然将递推式化简有
f(x)=i=1∑xi1
显然的调和级数,但考虑极限数据 n=231,O(n) 的计算会 T 成傻逼。
考虑 O(1) 计算调和级数
i=1∑ni1=i=1∑n∫ii+1⌊x⌋1dx
=∫1n+1x1+⌊x⌋1−x1dx
=∫1n+1x1dx+∫1n+1⌊x⌋1−x1dx
≈ln(n+1)+γ
以上内容转载自该博客。
γ 是欧拉常数,其值 γ≈0.57721566490153286060651209.
考虑到近似值在数据较小时有精度问题,我们不妨在 n≤107 时 O(n) 计算。
#include<bits/stdc++.h>
#define Euler 0.57721566490153286060651209 ;
using namespace std ;
int n ;
double ans ;
int main()
{
cin >> n ;
cout << fixed << setprecision(8) ;
if(n <= 1e7)
{
for(int i = 1 ; i <= n ; i ++) ans += (1.0 / i) ;
cout << ans ;
}
else cout << log(n + 1) + Euler ;
return 0 ;
}