题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5879
Problem Description
Given an integer n
, we only want to know the sum of 1/k2
where k
from 1
to n
.
Input
There are multiple cases.
For each test case, there is a single line, containing a single positive integer n .
The input file is at most 1M.
For each test case, there is a single line, containing a single positive integer n .
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
Hint:
题意:
给 n
,求 ∑k=1n1k2sum_{k=1}^{n}frac{1}{k^2}∑k=1nk21
。
题解:
n
很大的时候答案趋近于π26frac{pi^2}{6}6π2
,nnn
小的时候预处理即可。
其实可以直接暴力直接打表过,但是自己当时比较2,没想到,直接用了大数的相加。还有就是前导0自己忘记考虑了,哎,自己要做的事情还有很多啊。
代码:
#include <cmath> #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e6; #define met(a,b) memset(a,b,sizeof(a)) #define pi acos(-1.0) char s[maxn+1000]; double num[maxn]; int main() { met(num,0); num[1]=1; for(int i=2;i<=maxn;i++) num[i]=num[i-1]+1.0/i/i; while(scanf("%s",s)!=EOF) { int cnt=0; int l=strlen(s); int l1=l; while(s[cnt]=='0'||cnt==l) cnt++; l-=cnt; if(l>6) printf("%.5lf ",pi*pi/6.0); else { int sum=0; for(int i=0;i<l1;i++) sum=sum*10+s[i]-'0'; if(sum>maxn) printf("%.5lf ",pi*pi/6.0); else printf("%.5lf ",num[sum]); } } }