Python 从m到n个斐波那契数求和的最后一位。(0≤;𝑚;≤;𝑛;≤;10^14)

Python 从m到n个斐波那契数求和的最后一位。(0≤;𝑚;≤;𝑛;≤;10^14),python,algorithm,fibonacci,fibonacci-heap,Python,Algorithm,Fibonacci,Fibonacci Heap,我的代码如下: m, n = map(int, input().split()) # write function "fibtotal" which takes input x and gives accurate fib(x+2)%10 (as sum till fib(x) == fib(x+2) - 1) # using above function get fibtotal(m-1) and fibtotal(n) # subtract fibtotal(m-1) from fibt

我的代码如下:

m, n = map(int, input().split())

# write function "fibtotal" which takes input x and gives accurate fib(x+2)%10  (as sum till fib(x) == fib(x+2) - 1)
# using above function get fibtotal(m-1) and fibtotal(n)
# subtract fibtotal(m-1) from fibtotal(n) and do mod 10 gives last digit of sum from m to n
# take care of handling large input sizes, 0 ≤ There is a problem in the number of loop: you do x+1 loops where there should be x. And I don't understand why you don't start with 
sum = 0
.

Then, you can make use of the period to compute the sum in constant time, without any loop. The
aux
list was computed using
fibtotal1
.

def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a

def fibtotal1(n):
    return sum(fib(k) % 10 for k in range(n + 1)) % 10

def fibtotal2(n):
    s, a, b = 0, 0, 1
    for i in range(n % 60):
        a, b = b, a + b
        s += a
    return s % 10

aux = [0, 1, 2, 4, 7, 2, 0, 3, 4, 8, 3, 2, 6, 9, 6, 6, 3, 0, 4, 5,
       0, 6, 7, 4, 2, 7, 0, 8, 9, 8, 8, 7, 6, 4, 1, 6, 8, 5, 4, 0,
       5, 6, 2, 9, 2, 2, 5, 8, 4, 3, 8, 2, 1, 4, 6, 1, 8, 0, 9, 0]

def fibtotal3(n):
    return aux[n % 60]

print(all(fibtotal1(n) == fibtotal2(n) == fibtotal3(n) for n in range(1000)))
m,n=map(int,input().split())
#写入函数“fibtottal”,它接受输入x并给出精确的fib(x+2)%10(作为fib(x)==fib(x+2)-1的和)
#使用上述函数获取fibtotal(m-1)和fibtotal(n)
#从fibtotal(n)中减去fibtotal(m-1),do mod 10给出从m到n之和的最后一位数字

#注意处理较大的输入大小,0≤ 循环的数量有一个问题:在应该有x的地方执行x+1循环。我不明白你为什么不从
sum=0
开始

然后,您可以利用周期计算恒定时间内的和,而无需任何循环。使用
fibtotal1
计算
aux
列表

def fibtotal(m, n):
    return (fibtotal3(n) - fibtotal3(m - 1)) % 10
还要注意,在最后一步中,由于计算mod 10,差异可能为负值,因此应为:

m, n = map(int, input().split())


def fibtotal(x):

  sum = 1 # if both initial conditions fail then loop starts from 2

  x= x % 60 # pisano period of 10 is 60 and to get last digit we need to divide by 10

  if x == 0:
    sum = 1 # fib(2)
    return sum 

  if x == 1:
    sum = 2 # fib(3)
    return sum

  a, b = 0, 1

  for i in range(2, x+1): # to find sum till fib(x+2)

    c = a+b
    sum += c
    a, b = b, c

  return sum

# no need to subtract 1 from both as they cancel out
print((fibtotal(n)-fibtotal(m-1))%10)


对于路过的读者:
fibtotal2
fibtotal3
工作,因为
fib(n)%10
是周期60的周期,周期元素的总和是10的倍数。参见Math.SE.

循环的数量有一个问题:在应该有x的地方执行x+1循环。我不明白你为什么不从
sum=0
开始

然后,您可以利用周期计算恒定时间内的和,而无需任何循环。使用
fibtotal1
计算
aux
列表

def fibtotal(m, n):
    return (fibtotal3(n) - fibtotal3(m - 1)) % 10
还要注意,在最后一步中,由于计算mod 10,差异可能为负值,因此应为:

m, n = map(int, input().split())


def fibtotal(x):

  sum = 1 # if both initial conditions fail then loop starts from 2

  x= x % 60 # pisano period of 10 is 60 and to get last digit we need to divide by 10

  if x == 0:
    sum = 1 # fib(2)
    return sum 

  if x == 1:
    sum = 2 # fib(3)
    return sum

  a, b = 0, 1

  for i in range(2, x+1): # to find sum till fib(x+2)

    c = a+b
    sum += c
    a, b = b, c

  return sum

# no need to subtract 1 from both as they cancel out
print((fibtotal(n)-fibtotal(m-1))%10)


对于路过的读者:
fibtotal2
fibtotal3
工作,因为
fib(n)%10
是周期60的周期,周期元素的总和是10的倍数。正如Jean-Claude在上面提到的,有两个主要错误

循环运行的次数

理想情况下,循环应该运行x次(包括条件),但我将其与sum(fib(0到x))=fib(x+2)-1混淆,并使其运行x+2次

在许多地方不需要%10

唯一需要mod 10的地方是显示最终结果时的最后一个语句。此错误的原因是过于注重处理较大的输入大小,但它们已经在执行
x%60
时得到处理

相同的代码如下所示:


注:如果m>1,则值“sum”无关紧要,因为它在最后进行减法时会被抵消

正如Jean-Claude所提到的,有两个主要错误

循环运行的次数

理想情况下,循环应该运行x次(包括条件),但我将其与sum(fib(0到x))=fib(x+2)-1混淆,并使其运行x+2次

在许多地方不需要%10

唯一需要mod 10的地方是显示最终结果时的最后一个语句。此错误的原因是过于注重处理较大的输入大小,但它们已经在执行
x%60
时得到处理

相同的代码如下所示:


注:如果m>1,则值“sum”无关紧要,因为它在最后进行减法时会被抵消

这是从哪里来的?看起来像是黑客银行或类似的问题。这是从哪里来的?看起来像是黑客银行的问题或类似的问题。我一直循环到x+3,因为sum-till-fib(x)=fib(x+2)-1,我不明白为什么会失败。感谢更好的方法并指出错误我一直循环到x+3,因为sum-till-fib(x)=fib(x+2)-1,我无法理解为什么失败。感谢您提供更好的方法并指出错误