• LightOJ1234 Harmonic Number


     1 /*
     2  LightOJ1234 Harmonic Number 
     3  http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1234
     4  打表 分块
     5  由于只有加法运算,1e8时间是可以承受的。
     6  然而空间无法承受,于是以50个单位为一块进行分块。
     7  */
     8 #include <cstdio>
     9 #include <algorithm>
    10 #include <cstring>
    11 #include <cmath>
    12 #include <vector>
    13 #include <queue>
    14 #include <iostream>
    15 #include <map>
    16 #include <set>
    17 //#define test
    18 using namespace std;
    19 #ifdef old
    20 const int Nmax=1e6+7;
    21 double f[Nmax];
    22 #endif
    23 const int Nmax=1e8+5;
    24 const double eps=1e-9; 
    25 double f[Nmax/50+5];
    26 //double get_f(int n)
    27 //{
    28     //if(n<Nmax)
    29         //return f[n];
    30     //return 1.0/n+get_f(n-1);
    31 //}
    32 #ifdef old
    33 map<int ,double> mp;
    34 map<int ,double>::iterator it;
    35 double get_f(int n)
    36 {
    37     if(n<Nmax)
    38         return f[n];
    39     it=mp.find(n);
    40     if(it!=mp.end())
    41         return mp[n];
    42     it=mp.upper_bound(n); 
    43     if(it!=mp.begin())
    44         it--;
    45     //printf("it->n:%d
    ,it->first);
    46     double ans=it->second;
    47     for(int i=it->first+1;i<=n;i++)
    48     {
    49         ans+=1.0/i;
    50     }
    51     mp[n]=ans;
    52     return ans;
    53 }
    54 #endif
    55 int main()
    56 {
    57     #ifdef test
    58     #endif
    59     //freopen("loj1234.in","r",stdin);
    60     //freopen("tras.out","w",stdout);
    61 #ifdef old
    62     f[1]=1.0;
    63     for(int i=2;i<Nmax;i++)
    64        f[i]=f[i-1]+1.0/i;
    65 #endif
    66     //for(int i=1;i<=15;i++)
    67         //printf("%lf
    ",f[i]);
    68 #ifdef old
    69     mp[Nmax-1]=f[Nmax-1]; 
    70 #endif
    71     double tmp=0.0;
    72     for(int i=1;i<=1e8;i++)
    73     {
    74         tmp+=1.0/i;
    75         if(i%50==0)
    76             f[i/50]=tmp;
    77     }
    78     int n;
    79     int t;
    80     scanf("%d",&t);
    81     t=0;
    82     while(scanf("%d",&n)==1)
    83     {
    84         t++;
    85         printf("Case %d: ",t);
    86         double ans=0.0;
    87         ans=f[n/50];
    88         for(int i=n/50*50+1;i<=n;i++)
    89             ans+=1.0/i;
    90         printf("%.8lf
    ",ans+eps);
    91 #ifdef old
    92         printf("%.8lf
    ",get_f(n)+eps);
    93 #endif
    94 
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    vue移动端滚动插件BetterScroll
    vue商品推荐信息展示 案例
    css吸顶效果
    vue TabControl案例
    首页导航栏样式 案例
    HO引擎近况20210713
    go定时器--timer
    go定时器--Ticker
    Go测试--main测试
    Spring 核心技术 AOP 实例
  • 原文地址:https://www.cnblogs.com/BBBob/p/6705620.html
Copyright © 2020-2023  润新知