题意明确,第一种方法,模拟:
时间复杂度O(n)
空间复杂度O(1)
参考代码如下:
long long solve(int k) { long long n = 0; for (double Sn = 0; Sn <= k; ++n, Sn += 1.0 / n) ; return n; }
不过过不了第十个测试用例,TLE。
使用数论可以进一步优化,将时间复杂度优化到接近log级别
参考代码如下
long long solve(int k) { return floor(exp(k-0.5772156649) + 0.5); }
是因为,本题求和为调和级数,调和级数(即f(n))至今没有一个完全正确的公式,但欧拉给出过一个近似公式:(n很大时)
f(n)≈ln(n)+C+1/2*n
欧拉常数值:C≈0.57721566490153286060651209,
所以,直接用就可以了。