#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define INF 1000000000
#define maxn
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define mset(x) memset(x,0,sizeof(x))
#define C 0.577215664901
typedef __int64 ll;
double f[10020];
ll n;
int main(){
// freopen("a.txt","r",stdin);
// freopen(".out","w",stdout);
f[1]=1;
for(int i=2;i<=10010;i++){
f[i] = f[i-1]+ (1/(double)i);
}
while(cin>>n){
if(n>10000){
printf("%.4lf\n",log((double)n)+C);
}
else{
printf("%.4lf\n",f[n]);
}
}
// printf("%.4lf\n%.4lf",f[10000], log((double)10000)+C);
return 0;
}
/*
DESCRIPTION:
n个数有n!个排列,所有排列的循环数之和设为p(n)
所以N个数的期望的循环数是 f(n) = p(n)/n!
从数据看,就算O(n)也会爆
显然这是数学题
所以一开始觉得O(n)递推不行
后来想想,要是有个通项公式能直接推出f(n)也未尝不可
p(n)显然是推不出来的(数据太大)
f(n)只能从f(n-1)推
f(1)=1
f(2)=1.5
f(3)=1.833
f(4)=2.083
f(5)=2.283
显然啊,f[i] = f[i-1]+1/i
f[n] = 1/1 + 1/2 +... + 1/n
f(n)在n极大的时候趋于ln(n) + C
C=0.577215664901
*/
hdu4986Little Pony and Alohomora Part I数学+递推
最新推荐文章于 2017-08-31 20:29:31 发布