计算斐波那契时的模数问题

时间:2018-12-28 15:04:29

标签: python python-3.x fibonacci modulo

我正在尝试解决一个问题,该问题需要我计算斐波纳契数,最高为10 ^ 18 mod 10 ^ 9 + 7。这位在线法官说,在较小的情况下(不需要模数),我得到正确的答案,但是在较大的情况下,我得到了错误的答案。

否则该算法就没有问题,但是将结果保存到字典table中的备忘录似乎已失败。我不知道为什么。

luku = int(input())
table = {0:0, 1:1, 2:1}

def fib(num):

    if num in table:
        return table[num];

    if num % 2 == 0:
        puoli = num / 2;
        ans = (fib(puoli) * (2 * (fib(puoli + 1)) - fib(puoli))) % 1000000007;
        table[num] = ans;
        return ans;
    else:
        puoli = (num-1) / 2;
        ans = (fib(puoli + 1)*fib(puoli + 1) + fib(puoli)*fib(puoli)) % 1000000007;
        table[num] = ans;
        return ans;


print(fib(luku))

例如,使用输入54774730983471038,我得到的是946469205,而不是正确的答案795317107。

1 个答案:

答案 0 :(得分:3)

记忆没有错。

可能令您惊讶的是,问题是浮点精度(是的,您的数字被截断了)。

您应该用整数除法运算符/(双精度)替换浮动除法运算符//(单斜杠)。

下面的代码(上面提到的唯一解决方法)对我有用:

luku = int(input())
table = {0:0, 1:1, 2:1}

def fib(num):
    if num in table:
        return table[num];

    if num % 2 == 0:
        puoli = num // 2;
        ans = (fib(puoli) * (2 * (fib(puoli + 1)) - fib(puoli))) % 1000000007;
        table[num] = ans;
        return ans;
    else:
        puoli = (num-1) // 2;
        ans = (fib(puoli + 1)*fib(puoli + 1) + fib(puoli)*fib(puoli)) % 1000000007;
        table[num] = ans;
        return ans;


print(fib(luku))

请参阅:

ibug@ubuntu:~ $ python3 t.py
54774730983471038
795317107