HDU 5879 - Cure【2016 ACM 区域赛青岛赛区网络赛】

来源:互联网 发布:linux总内存查看命令 编辑:程序博客网 时间:2024/05/16 04:06

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.



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
 
题意:给出一个 n,求出 1 到 n 的1/(n^2)的和。

我是通过打表找出了后面的一个临界值,过界后得数就不变了,前面的直接计算,不过可以将已经计算出来的保存一下, 这样快一点。

#include <cstdio>#include <cstring>double num[130000] = {0};char str[100000+5];int main(){    long long n;    num[1] = 1;    while (scanf("%s", str) != EOF)    {        n = 0;        int cur = 0;        while (str[cur] == '0')            cur++;        int len_true = strlen(str);        int len_false = len_true - cur;        if (len_false > 6)        {            printf("1.64493\n");            continue;        }        for (int i = cur; i < len_true; ++i)        {            n *= 10;            n += str[i] - '0';        }        if (n >= 123964)        {            printf("1.64493\n");            continue;        }        double x;        double ans = 0;        for (long long i = n; i > 0; --i)        {            if (num[i] != 0)            {                ans += num[i];                break;            }            x = (double)1/i/i;            ans += x;        }        num[n] = ans;        printf("%.5lf\n", num[n]);    }    return 0;}
 


 

1 0
原创粉丝点击