题目分析:
我们令$G(x)$表示前$x$个点的平均深度,$F(x)$表示第$x$个点的期望深度。
有$F(x) = G(x-1)+1$,$G(x) = G(x-1)+frac{1}{x}$
所以答案相当于一个调和级数和的前缀和,我们对小于1e6的暴力处理,大于1e6的利用欧拉常数做。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const double euler = 0.57721566490153286060651209; 5 6 long long n; 7 8 int main(){ 9 while(scanf("%lld",&n) == 1){ 10 if(n <= 1e6){ 11 double ans = 0; 12 for(int i=1;i<=n;i++) ans += (double)(n-i+1)/(double)i; 13 ans /= n; 14 printf("%.10lf ",ans); 15 }else{ 16 double hh = log(n)+euler; 17 hh = hh*(n+1)-n; 18 hh /= n; 19 printf("%.10lf ",hh); 20 } 21 } 22 return 0; 23 }