我试图使用Python 2.7.9作为我的编码语言来解决SPOJ中的ZSUM问题,并设计了一个程序来实现。由于代码运行完美但在判断时给出了TLE,我猜它还不够快。是否有可能优化以下代码以满足判断要求,或者使用Python无法击败挑战。
问题的链接:http://www.spoj.com/problems/ZSUM/
def zsum(n,k):
a=2*pow(n-1,k,10000007)
b=pow(n,k,10000007)
c=2*pow(n-1,n-1,10000007)
d=pow(n,n,10000007)
zsum=(a+b+c+d)%10000007
print zsum
def main():
while True:
n,k=map(int,raw_input().split())
if n==k==0:
break
else:
zsum(n,k)
main()
答案 0 :(得分:0)
我不知道这是否会有所帮助(如果您阅读了问题的评论,您会看到有人说在Python中无法解决这种问题 - 这可能发生在语言较慢的在线评委身上)但你可以优化代码:
def zsum(n,k):
a=2*pow(n-1,k,10000007) # (1)
b=pow(n,k,10000007) # (2)
c=2*pow(n-1,n-1,10000007) # (1)
d=pow(n,n,10000007) # (2)
zsum=(a+b+c+d)%10000007
print zsum
请注意,在(1)
中,您计算pow(n - 1, min(k, n - 1))
两次。您可以计算一次,然后仅对剩下的内容使用模幂运算。与(2)
相同。
答案 1 :(得分:0)
由于在总共2335个成功提交中没有接受的python解决方案,我认为,无论您如何优化您的解决方案,它都不可能被python接受。尽管python是一种非常有用的语言,但它在编程竞赛中并不是首选,因为它非常慢(例如与C / C ++相比)。如果您知道如何用C ++编写代码,那么您一定要试一试,尽管您必须编写自己的模幂运算程序。