我想优化此代码,但我不知道如何进一步优化。 以下是输入的示例:
3 #size of array
3 4 3 #data in array
6 # number of commands
C 1 2
C 1 3
C 3 3
U 1 4
C 1 3
C 1 2
' C'和' U'请参阅以下操作:
C X Y : Compute the value of F( A[X] ) + F( A[X + 1] ) + F( A[X + 2] ) + .... + F( A[Y] ) (mod 10^9 + 7)
U X Y: Update the element of array A[X] = Y
这是我的代码:
from fractions import gcd
local_gcd=gcd
def F(x):
global local_gcd
sum1=0
for i in range(1,x+1):
sum1+=local_gcd(i,x)
return sum1
size_of_list=int(input())
ele=input()
eles=ele.split(" ")
A=[]
for i in eles:
A.append(int(i))
num_of_commands=int(input())
mod_val=1000000007
for i in range(0,num_of_commands):
com=input()
com_list=com.split(" ")
x=int(com_list[1])
y=int(com_list[2])
sum1=0
if com_list[0]=='C':
for i in range(x,y+1):
sum1+=F(A[i-1])
print(sum1%mod_val)
elif com_list[0]=='U':
A[x-1]=y
答案 0 :(得分:0)
您可以使用Memoization加快速度。也就是说,一旦你弄清楚F(i)是什么,你就再也不需要计算它了。
在您的示例中,您将进行的F()调用是:
F(3), F(4)
F(3), F(4), F(3)
F(3)
F(4), F(4), F(3)
F(4), F(4)
通过“记忆”F(),您只需要计算两个值:F(3)和F(4)。
如果您使用的是Python 3.2或更高版本,请尝试使用内置的functools.lru_cache
装饰器自动执行此操作:https://stackoverflow.com/a/14731729/4323