【发布时间】:2019-09-30 20:07:44
【问题描述】:
我试图通过仅保留最右边的六个数字来有效地计算可能非常大的第 n 个斐波那契值。例如 fib(1000000) 将只返回 546875。
我知道一些递归矩阵求幂算法,我一直在测试一个 O(log n) 实现,如下所示 -
def solution(n):
fibs = {0: 0, 1: 1}
def fib(n):
# recursive helper function
if n in fibs:
return fibs[n]
if n % 2 == 0:
fibs[n] = ((2 * fib((n / 2) - 1)) + fib(n / 2)) * fib(n / 2) % 1000000
return fibs[n]
else:
fibs[n] = (fib((n - 1) / 2) ** 2) + (fib((n+1) / 2) ** 2) % 1000000
return fibs[n]
answer = fib(n)
return answer % 1000000
所有答案似乎都有效,直到 n = 1000000。10 的所有后面的指数都应该返回相同的答案吗? 10^k 其中 k = [7, 8, 9, 10...] 都返回 546875(一百万的价值)。我认为它们应该是因为当您将它们模数为 10^6 时,这些值具有相同的余数为零。所以我想知道这个实现是否正确?
【问题讨论】:
-
为什么第 8、11 和 15 行有
% 1000000? -
@galaxy001 他保留了最右边的 6 个数字
-
我看到第 100 万个 FIB 序列号以 '484376' 结尾...