[英]Modular Exponentiation in Python
我试图使用Python 2.7.9作为我的编码语言来解决SPOJ上的ZSUM问题,并设计了一个程序来解决这个问题。 由于代码可以完美运行,但是会给评委一个标题,所以我认为它不够快。 是否有可能优化下面的代码以满足法官的要求,或者使用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()
我不知道这是否有帮助(如果您阅读问题的注释,您会看到有人说无法用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)
相同。
由于总共2335个成功的提交中有零个被接受的python解决方案,所以我认为,无论您如何优化解决方案,都不太可能被python接受。 尽管python是一种非常有用的语言,但它在编程竞赛中并不受欢迎,因为它非常慢(例如,与C / C ++相比)。 如果您知道如何使用C ++进行编码,则尽管应该编写自己的模块化求幂过程,但您绝对应该尝试一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.