• 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

  • 相关阅读:
    太tmd恐怖了,一个搞破解的过程分析。
    JQuery爱好者们的福音:jQuery EasyUI 开源插件套装 完全替代ExtJS
    期待5月的灿烂阳光
    2010 2月记
    JQuery 的跨域方法 可跨任意网站
    准备写个ASP.NET MVC 2开发的系列文章
    Win7 访问网络共享文件夹显示空白目录的问题解决
    4月的长沙
    将ASP.NET MVC 2.0 部署在IIS6和IIS7上的教程
    谈谈年底感想
  • 原文地址:https://www.cnblogs.com/lcchy/p/10139565.html
Copyright © 2020-2023  润新知