Project Euler 235

プロジェクトオイラー
http://projecteuler.net/

Q235.
u(k) = (900 - 3k)rkとして、s(n) = u(0) + ... + u(n)としたとき、s(5000) = -600,000,000,000となるrを小数点以下12桁まで求めよ。

ちょっと掲示板を覗いたら、誰もuの計算をしていなくて驚いた。解を求めるのは、二分探索で。



def s(r, n):
return (a - b * (1 - r ** n) / (1 - r)
- (a - b * n) * r ** n) / (1 - r)

a = 900
b = 3
n = 5000
N = -6e11
r0 = 1
r1 = 1.005
eps = 1e-13
while r1 - r0 > eps:
r2 = (r0 + r1) / 2
if s(r2, n) > N:
r0 = r2
else:
r1 = r2
print "%.12f" % ((r0 + r1) / 2, )