#python2
def sum_fib(m,n):
a=list()
a.append(0)
a.append(1)
i=2
while i<=n:
a.append((a[i-1]+a[i-2])%10)
if a[i]==1 and a[i-1]==0:
break
i+=1
if n>60:
a.pop()
#res=sum(a)%10
q=n-m
j=m%60
su=0
while q>=0:
su+=a[j]
j+=1
if j==60:
j=0
q-=1
return su%10
if __name__=='__main__':
num=[int(x) for x in raw_input().split()]
print sum_fib(num[0],num[1])
此代码工作正常,但需要时间才能获得大的Fibonacci数。请帮我解决一下这个。
输入:1 100000000
得到time limit exceeded-> error Time used: 9.36/5.00
答案 0 :(得分:2)
您正在尝试使用Fibonacci 60 Repeating Pattern,但效率不高:
通过以下循环,您仍然可以收集数千个Fibonacci数字,而您只需要其中的60个:
while i<=n:
a.append((a[i-1]+a[i-2])%10)
为避免您需要多次运行这60个数字,您可以使用60个连续斐波纳契数之和的最后一位数始终为0的属性。这实际上意味着您不需要总计数千个数字,只是前60个斐波那契数字的一部分,因为再增加60个数字不会改变总和的最后一个数字。
所以,...你可以通过取其模60来修剪输入变量,然后运行存储的60个Fibonacci列表来计算所需的总和。
以下是改编的代码:
def sum_fib(m,n):
if m > n:
return
# Collect 60 Fibonnaci numbers
a = [0, 1]
for i in xrange(2, 60):
a.append(a[i-1] + a[i-2])
# Simplify the input arguments, as the last digit pattern repeats with a period of 60,
# and the sum of 60 such consecutive numbers is 0 mod 10:
m = m % 60
n = n % 60
# Make sure n is greater than m
if n < m:
n += 60
su = 0
for j in xrange(m, n+1): # Assume n index is inclusive
su += a[j % 60]
return su % 10
上查看它