class Solution:
    def fib(self, n: int) -> int:
        a = 0
        x = 1
        if n == 0:
            return a
        for i in range(n - 1):
            x, a = x + a, x
        return x % 1000000007

s = Solution()

print(s.fib(10))

'''
为什么要模1000000007（跟我念，一，八个零，七）。参考https://www.liuchuo.net/archives/645

大数相乘，大数的排列组合等为什么要取模
1000000007是一个质数（素数），对质数取余能最大程度避免结果冲突/重复
int32位的最大值为2147483647，所以对于int32位来说1000000007足够大。
int64位的最大值为2^63-1，用最大值模1000000007的结果求平方，不会在int64中溢出。
所以在大数相乘问题中，因为(a∗b)%c=((a%c)∗(b%c))%c，所以相乘时两边都对1000000007取模，再保存在int64里面不会溢出。
这道题为什么要取模，取模前后的值不就变了吗？
确实：取模前 f(43) = 701408733, f(44) = 1134903170, f(45) = 1836311903, 但是 f(46) > 2147483647结果就溢出了。

_____，取模后 f(43) = 701408733, f(44) = 134903163 , f(45) = 836311896, f(46) = 971215059没有溢出。

取模之后能够计算更多的情况，如 f(46)

这道题的测试答案与取模后的结果一致。

总结一下，这道题要模1000000007的根本原因是标准答案模了1000000007。不过大数情况下为了防止溢出，模1000000007是通用做法，原因见第一点。
'''
532d86518029f33fe1ea674b66f7f13db7b34038
class Solution:
    <mask token>


<mask token>

class Solution:

    def fib(self, n: int) ->int:
        a = 0
        x = 1
        if n == 0:
            return a
        for i in range(n - 1):
            x, a = x + a, x
        return x % 1000000007


<mask token>

class Solution:

    def fib(self, n: int) ->int:
        a = 0
        x = 1
        if n == 0:
            return a
        for i in range(n - 1):
            x, a = x + a, x
        return x % 1000000007


<mask token>
print(s.fib(10))
<mask token>

class Solution:

    def fib(self, n: int) ->int:
        a = 0
        x = 1
        if n == 0:
            return a
        for i in range(n - 1):
            x, a = x + a, x
        return x % 1000000007


s = Solution()
print(s.fib(10))
<mask token>

class Solution:
    def fib(self, n: int) -> int:
        a = 0
        x = 1
        if n == 0:
            return a
        for i in range(n - 1):
            x, a = x + a, x
        return x % 1000000007

s = Solution()

print(s.fib(10))

'''
为什么要模1000000007（跟我念，一，八个零，七）。参考https://www.liuchuo.net/archives/645

大数相乘，大数的排列组合等为什么要取模
1000000007是一个质数（素数），对质数取余能最大程度避免结果冲突/重复
int32位的最大值为2147483647，所以对于int32位来说1000000007足够大。
int64位的最大值为2^63-1，用最大值模1000000007的结果求平方，不会在int64中溢出。
所以在大数相乘问题中，因为(a∗b)%c=((a%c)∗(b%c))%c，所以相乘时两边都对1000000007取模，再保存在int64里面不会溢出。
这道题为什么要取模，取模前后的值不就变了吗？
确实：取模前 f(43) = 701408733, f(44) = 1134903170, f(45) = 1836311903, 但是 f(46) > 2147483647结果就溢出了。

_____，取模后 f(43) = 701408733, f(44) = 134903163 , f(45) = 836311896, f(46) = 971215059没有溢出。

取模之后能够计算更多的情况，如 f(46)

这道题的测试答案与取模后的结果一致。

总结一下，这道题要模1000000007的根本原因是标准答案模了1000000007。不过大数情况下为了防止溢出，模1000000007是通用做法，原因见第一点。
'''