题解 P5147 【随机数生成器】
NaCly_Fish · · 题解
这题感觉丢到高一数学作业里也没问题吧(
首先我们设那个函数的期望值为
移项一下,可以得到
然后这样就可以
有了上面的递推式,再搞一下得出通项
( 这里可以先找规律猜结论,用数学归纳法很好证 )
后面是调和级数的前
所以
进一步地,可以得到:
所以
时间复杂度
代码很简单:
#include<cstdio>
#include<cmath>
int n;
double ans;
int main(){
scanf("%d",&n);
if(n<100000) for(int i=1;i<n;++i) ans += 1.0/i;
else ans = log(n)+0.577215664901532;
printf("%.5lf",n==1?0:ans+1);
return 0;
}