zoukankan      html  css  js  c++  java
  • Harmonic Number (LightOJ 1234)(调和级数 或者 区块储存答案)

    题解:隔一段数字存一个答案,在查询时,只要找到距离n最近而且小于n的存答案值,再把剩余的暴力跑一遍就可以。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e8 + 10;
    const int M = 2e6 + 10;
    double a[M];
    
    void Init()
    {
        a[0] = 0.0;
        double ans = 1;
        for( int i = 2; i < N; i ++)
        {
            ans += 1.0 / i;
            if(i % 50 == 0)
            {
                a[i/50] = ans;
            }
        }
        return ;
    }
    
    int main()
    {
        int t,n,cas = 0;
        Init();
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            int now = n / 50;
            double ans = a[now];
            for(int i = now*50 + 1; i <= n; i ++)
            {
                ans += 1.0 / i;
            }
            printf("Case %d: %.9lf
    ",++cas,ans);
        }
        return 0;
    }

    数论正解:

    知识点:

         调和级数(即f(n))至今没有一个完全正确的公式,但欧拉给出过一个近似公式:(n很大时)

          f(n)≈ln(n)+C+1/2*n    

          欧拉常数值:C≈0.57721566490153286060651209

          c++ math库中,log即为ln。

    (转自:https://www.cnblogs.com/shentr/p/5296462.html

        因为公式存在误差,在数值n比较小的时候直接暴力求解。

    /** 转自:https://www.cnblogs.com/shentr/p/5296462.html */
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    const double r=0.57721566490153286060651209;     //欧拉常数
    double a[10000];
    
    int main()
    {
        a[1]=1;
        for (int i=2;i<10000;i++)
        {
            a[i]=a[i-1]+1.0/i;
        }
        int n;
        cin>>n;
        for (int kase=1;kase<=n;kase++)
        {
            int n;
            cin>>n;
            if (n<10000)
            {
                printf("Case %d: %.10lf
    ",kase,a[n]);
            }
            else
            {
                double a=log(n)+r+1.0/(2*n);
                //double a=log(n+1)+r;
                printf("Case %d: %.10lf
    ",kase,a);
            }
        }
        return 0;
    }

    Problem

    In mathematics, the nth harmonic number is the sum of the reciprocals of the first n natural numbers:

    In this problem, you are given n, you have to find Hn.

    Input

    Input starts with an integer T (≤ 10000), denoting the number of test cases.

    Each case starts with a line containing an integer n (1 ≤ n ≤ 108).

    Output

    For each case, print the case number and the nth harmonic number. Errors less than 10-8 will be ignored.

    Sample Input

    12

    1

    2

    3

    4

    5

    6

    7

    8

    9

    90000000

    99999999

    100000000

    Sample Output

    Case 1: 1

    Case 2: 1.5

    Case 3: 1.8333333333

    Case 4: 2.0833333333

    Case 5: 2.2833333333

    Case 6: 2.450

    Case 7: 2.5928571429

    Case 8: 2.7178571429

    Case 9: 2.8289682540

    Case 10: 18.8925358988

    Case 11: 18.9978964039

    Case 12: 18.9978964139

  • 相关阅读:
    P1121 环状最大两段子段和
    无题
    cdoj 1485 柱爷搞子串 sam treap
    自然数幂和
    Gym 100341C AVL Trees NTT
    线性筛分解质因子
    codeforces 366 Ant Man dp
    UVALive 6914 Maze Mayhem 轮廓线dp
    hdu 5790 Prefix 字典树 主席树
    莫比乌斯反演个人小结
  • 原文地址:https://www.cnblogs.com/lcchy/p/10139565.html
Copyright © 2011-2022 走看看