题目:
Given an integer nn, we only want to know the sum of 1/k21/k2 where kk from 11 to nn.
Input
There are multiple cases.
For each test case, there is a single line, containing a single positive integer nn.
The input file is at most 1M.
Output
The required sum, rounded to the fifth digits after the decimal point.
Sample Input
1 2 4 8 15
Sample Output
1.00000 1.25000 1.42361 1.52742 1.58044
题意:求解从1--n的 1/k*k的和,然后保留五位小数输出。
解题思路:先打表预处理一下,然后坑点就来了,n的输入的话,应该是用字符串输入,因为它可能会很大,否则会一直RE,还注意的就是不用求到无穷,只需要跑到120000,之后增加值近乎为0,直接输出就好。
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 1200008
typedef long long ll;
double num[maxn];
void db()
{
num[0]=0;
for(ll i=1;i<=maxn;i++)
num[i]+=(double)(1.0/(i*i))+num[i-1];
}
int main()
{
int n;
db();
string s;
while(cin>>s)
{
n=0;
int flag=0;
for(int i=0;i<s.size();i++)
{
n=n*10+s[i]-'0';
if(n>120000)
{
flag=1;
break;
}
}
if(flag)
{
printf("%.5lf\n",num[120000]);
}
else
printf("%.5lf\n",num[n]);
}
return 0;
}