Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

问题:

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式:

输入包含一个整数n。

输出格式:

输出一行,包含一个整数,表示Fn除以10007的余数。

解法1 (递归) 不推荐使用

解法1 使用递归的思想,,当n较大时,会出现运行超时的问题,并且不太好理解

def tk(n):
if n==1 or n==2:
return 1
else:
return tk(n-1)+tk(n-2)

n=int(input())
a=tk(n)
a=a%10007
print(a)

解法2 (使用列表)

解法2 使用列表存储数,使用使用循环,将数添加到列表中,然后供下次计算。在最后只需要将列表最后一个数打印就好,

def tk2(n):
list=[1,1]
for i in range(n-2):
list.append(list[-1]+list[-2])
return list[n-1]

n=int(input())
a=tk2(n)
a=a%10007
print(a)

解法3(解法2的优化)

解法2使用了列表存储每一次计算出的Fibonacci数列数,,如果当n较大的情况下,会出现导致列表存不下这么多,当然现实中是没问题的,,但是在题目中规定了内存占用大小。所以解法3会对其进行优化,采用3个变量来存储

def tk2(n):
a=1
b=1
c=0
if n==1 or n==2:
return 1
else:
for i in range(n-2):
c=a+b
a,b=b,c

return c

n=int(input())
a=tk2(n)%10007

print(a)

解法4 (本人最优)

解法3解决了内存超限的问题,但是还有一点点小问题,我们条件中要求 时间限制1.0s ,而我在测试解法3时,运行时长是1.062ms,所以还是不符合要求,从而催动了解法4的诞生。

n=eval(input())
a=1
b=1
c=0
if n==1 or n==2:
print(1)
else:
for i in range(2,n):
c=(a+b)%10007
a,b=b,c

print(c)

解法4是本人写的最优秀的解法。。内存占用 8.681mb 运行时长 218ms