洛谷P1943 LocalMaxima_NOI导刊2009提高(1)
前言
俗话说得好,智商不够,打表来凑…
标签
- 数论
- 分段打表
简明题意
求 ∑ i = 1 n 1 i , 其 中 i < = 2 31 − 1 求\sum_{i=1}^n\frac1i,其中i <=2^{31}-1 求i=1∑ni1,其中i<=231−1
思路
- 好吧我直接给公式了,这个公式我并没有推出来…这篇博客主要将如何计算上面的式子,现在我们假设已经推出了公式…
- 法1:所求和式是一个调和级数,当 n → ∞ n\to\infty n→∞,原式 → l n ( n − 1 ) + r \to ln(n-1)+r →ln(n−1)+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;
}
双倍经验
- 无