题意
[phi(x) = sum_{k = 1} ^ {infty} frac{1}{k(k + x)}
]
求 (phi(0.0), phi(0.1), ..., phi(300.0)),保证绝对误差不超过 ({10} ^ {-10}),时间限制 100 ms.
分析
一种简单暴力的想法是设置一个阈值 (T):对 (k le T),直接暴力累加;对 (k > T),直接估计。然而,在指定的时间内,不管如何设置 (T),精度都远远不够。
考虑对 (phi(x)) 做一些转化,使得转化后的对象 (mu(x)) 收敛得更快,对转化后的对象 (mu(x)) 用相同的方法计算,然后再根据 (phi(x)) 与 (mu(x)) 的关系,计算得到 (phi(x))。
注意到
[phi(1) = sum_{k = 1} ^ {infty} frac{1}{k(k + 1)} = 1
]
对 (phi(x)) 作转化:令 (phi(x)) 减去 (phi(1)),得
[phi(x) - phi(1) = (1 - x)sum_{k = 1} ^ {infty} frac{1}{k(k + 1)(k + x)} = (1 - x) mu(x)
]
然而这样还是过不了。
正解的做法应该是对 (mu(x)) 继续进行变换,然而我又变换了三四次,依然无法满足题意要求,误差还越来越大(我猜测这是因为对转化量的的要求越来越高)。
只能去考虑对于不同的 (x),(phi(x)) 之间存在什么联系。
先对 (phi(x)) 进行裂项转化:
[phi(x) = sum_{k = 1} ^ {infty} frac{1}{k(k + x)} = frac{1}{x} sum_{k = 1} ^ {infty} (frac{1}{k} - frac{1}{k + x})
]
[phi(x + 1) = sum_{k = 1} ^ {infty} frac{1}{k(k + x + 1)} = frac{1}{x + 1} sum_{k = 1} ^ {infty} (frac{1}{k} - frac{1}{k + x + 1})
]
那么有
[xphi(x) = (x + 1)phi(x + 1) - frac{1}{1 + x}
]
观察得知 (phi) 越小,我们的方法计算精度越高。于是我们可以设置更大的阈值 (T),更精确地计算 (phi(0.0, 0.1, 0.2, ..., 0.9)),然后根据上面的等式关系,推出所有的解。