背景
刷题的时候用 **
提示超时,就想着利用 python的 math 模块偷个懒,因为math.pow() 始终调用c语言写的那个代码,时间复杂度老低了,可能会加快速度,但是出现了错误,没办法只能手写快速幂
错误原因
math.pow()函数计算幂运算,因为结果数值过大导致溢出。
解决办法
手写快速幂自己实现快速幂
代码
mod 是因为数字过大要对 109+7取余数,mod = 109+7
def q_pow(self,n,m,mod):
res = 1
while m:
if m&1:
res = res*n % mod
n = n*n%mod
m = m>>1
return res
那道题的完整链接加代码如下: 1808. 好因子的最大数目
class Solution:
def maxNiceDivisors(self, primeFactors: int) -> int:
if primeFactors<=4:
return primeFactors
mod = 10**9+7
a = primeFactors//3
b = primeFactors%3
# 直接求不行会超时
# if b==0:
# return 3**a%mod
# elif b==1:
# return 3**(a-1)*4%mod
# else:
# return 3**a*2%mod
# 手写快速幂
if b==0:
return self.q_pow(3,a, mod)
elif b==1:
return (self.q_pow(3,a-1, mod)*4) % mod
else:
return (self.q_pow(3,a, mod)*2) % mod
def q_pow(self,n,m,mod):
res = 1
while m:
if m&1:
res = res*n % mod
n = n*n%mod
m = m>>1
return res