洛谷P1943 LocalMaxima_NOI导刊2009提高(1)数论+分段打表


洛谷P1943 LocalMaxima_NOI导刊2009提高(1)


前言

俗话说得好,智商不够,打表来凑…


标签

  • 数论
  • 分段打表

简明题意

求 ∑ i = 1 n 1 i , 其 中 i &lt; = 2 31 − 1 求\sum_{i=1}^n\frac1i,其中i &lt;=2^{31}-1 i=1ni1i<=2311


思路

  • 好吧我直接给公式了,这个公式我并没有推出来…这篇博客主要将如何计算上面的式子,现在我们假设已经推出了公式…
  • 法1:所求和式是一个调和级数,当 n → ∞ n\to\infty n,原式 → l n ( n − 1 ) + r \to ln(n-1)+r ln(n1)+r,其中 r r r是欧拉常数,其值约为0.57721566490153286060651209,因此,当n大于1e7左右时,我们直接用这个公式
  • 法2:分段打表大法好
    分段打表就好了23333333333333

注意事项


总结


AC代码

#include<cstdio>

int n;
int gap = 3e7, table_num;

double ans[1000];

void solve()
{
   ans[0] = 0, ans[1] = 17.79392362118970183360, ans[2] = 18.48707079341966519337, ans[3] = 18.89253589874997629749, ans[4] = 19.18021796981509297098, ans[5] = 19.40336152029585292667, ans[6] = 19.58568307653481355146, ans[7] = 19.73983375596484535208, ans[8] = 19.87336514829236833179, ans[9] = 19.99114818371667468000, ans[10] = 20.09650869918964133376, ans[11] = 20.19181887884256809684, ans[12] = 20.27883025570542585569, ans[13] = 20.35887296327234707860, ans[14] = 20.43298093533479331541, ans[15] = 20.50197380674207181528, ans[16] = 20.56651232781038274311, ans[17] = 20.62713694956564225436, ans[18] = 20.68429536335093388288, ans[19] = 20.73836258457256320753, ans[20] = 20.78965587891597621706, ans[21] = 20.83844604304580627741, ans[22] = 20.88496605864435551325, ans[23] = 20.92941782118230165111, ans[24] = 20.97197743557140015014, ans[25] = 21.01279943006328210231, ans[26] = 21.05202014319138470455, ans[27] = 21.08976047114996887899, ans[28] = 21.12612811529897527407, ans[29] = 21.16121943509052627519, ans[30] = 21.19512098674612943228, ans[31] = 21.22791080955165554656, ans[32] = 21.25965950784913616189, ans[33] = 21.29043116650026590264, ans[34] = 21.32028412963516572631, ans[35] = 21.34927166649542229493, ans[36] = 21.37744254344768179976, ans[37] = 21.40484151762337461378, ans[38] = 21.43150976469361879140, ans[39] = 21.45748525108544768614, ans[40] = 21.48280305906103748725, ans[41] = 21.50749567164108810857, ans[42] = 21.53159322320884783153, ans[43] = 21.55512372061077286389, ans[44] = 21.57811323882685883291, ans[45] = 21.60058609466881307526, ans[46] = 21.62256500138119008625, ans[47] = 21.64407120659432237630, ans[48] = 21.66512461578413351049, ans[49] = 21.68574390298127951837, ans[50] = 21.70594661028950156378, ans[51] = 21.72574923758188703005, ans[52] = 21.74516732343158054164, ans[53] = 21.76421551839587209543, ans[54] = 21.78290765140078732998, ans[55] = 21.80125679006347638733, ans[56] = 21.81927529556289613311, ans[57] = 21.83697487265570558179, ans[58] = 21.85436661536231284231, ans[59] = 21.87146104871899154887, ans[60] = 21.88826816702728095265, ans[61] = 21.90479746897837998176, ans[62] = 21.92105798984407627472, ans[63] = 21.93705833118761105993, ans[64] = 21.95280668815192726129, ans[65] = 21.96831087467954901626, ans[66] = 21.98357834680603772881, ans[67] = 21.99861622416893069953, ans[68] = 22.01343130994822416824, ans[69] = 22.02803010936736072267, ans[70] = 22.04241884681671947988, ans[71] = 22.05660348180331453705;
   
   scanf("%d", &n);
   int begin_id = (n / gap) * gap;
   double begin_val = ans[n / gap];

   for (int i = begin_id + 1; i <= n; i++)
   	begin_val += 1.0 / i;

   printf("%.8lf", begin_val);
}

int main()
{
   solve();
   return 0;
}

双倍经验

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值