Little Pony and Alohomora Part I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 396 Accepted Submission(s): 207
Problem Description
Trixie is a female unicorn pony and traveling magician, having been rumored to be "the most magical unicorn in all of Equestria". One day, Trixie arrives in Ponyville.

There is n boxes on the stage. There is a random key in each box and each box has a key match it. As a unicorn, Trixie can use "Alohomora"(the unlocking spell) to open any box.
Trixie would like to open all the boxes, also Trixie would like to minimize the spells she used. Help Trixie to calculate the expected number of spells she need to used in order to open all the boxes necessary.

There is n boxes on the stage. There is a random key in each box and each box has a key match it. As a unicorn, Trixie can use "Alohomora"(the unlocking spell) to open any box.
Trixie would like to open all the boxes, also Trixie would like to minimize the spells she used. Help Trixie to calculate the expected number of spells she need to used in order to open all the boxes necessary.
Input
Input contains multiple test cases (less than 100).
For each test case, only one line contains one integer n (1<=n<=1000000000).
For each test case, only one line contains one integer n (1<=n<=1000000000).
Output
For each case, output the corresponding result, rounded to 4 digits after the decimal point.
Sample Input
1 2
Sample Output
1.0000 1.5000HintThe second sample: There are two different permutations when n equal to 2: (1, 2) and (2, 1). Trixie need to use 2 spells in (1, 2) and 1 spell in (2, 1).
设:E[i]为i个盒子的期望则有再增加一个盒子有两种情况钥匙在该盒子内此时期望为E[i+1]=E[i]+1;第二种情况钥匙不在该盒子内则有E[i+1]=E[i]考虑第一种情况的发生概率为1/(i+1)第二种情况发生的概率为i/(I+1)所以有E[i]=E[i-1]+1/i;E[1]=1;即求调和数列的前n项和;
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<list>
#include<cmath>
#include<vector>
#define euler 0.57721566490153286060651209
using namespace std;
const int maxn=2000010;
double E[maxn];
void init(){
for(int i=1;i<maxn;++i){
E[i]=E[i-1]+1.0/i;
}
}
int main()
{
init();
int n;
while(scanf("%d",&n)!=EOF){
if(n<maxn){
printf("%.4lf\n",E[n]);
}
else {
printf("%.4lf\n",log(n)+euler);
}
}
return 0;
}