LeetCode 372 题 Super Pow,让你进行巨大的幂运算,然后求余数。
要求你的算法返回幂运算
a
b
a^b
ab 的计算结果与 1337 取模(mod,也就是余数)后的结果。就是你先得计算幂
a
b
a^b
ab,但是这个 b 会非常大,所以 b 是用数组的形式表示的。
先将原问题分解为子问题。如下:
已知
(a * b) % k = (a % k)(b % k) % k
完整代码
class Solution:
def superPow(self, a: int, b: List[int]) -> int:
def pow(a, k):
a %= 1337
res = 1
i = 0
while i < k:
res *= a
res %= 1337
i += 1
return res
if not b:
return 1
num = b.pop()
part1 = pow(a, num)
part2 = pow(self.superPow(a, b), 10)
return (part1 * part2) % 1337
优化
另一种求
a
k
a^k
ak的方法,如果
k
k
k为奇数,
a
k
a^k
ak =
a
a
a*
a
k
−
1
a^{k-1}
ak−1; 如果k为偶数,
a
k
a^k
ak =
a
k
/
2
a^{k/2}
ak/2 *
a
k
/
2
a^{k/2}
ak/2
代码如下
def pow(a, k):
base = 1337
if k == 0:
return 1
if k % 2 == 0:
sub = pow(a, k / 2)
return (sub * sub) % base
elif k % 2 == 1:
return (a * pow(a, k - 1)) % base
LeetCode 50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
n正负都行,类似于二分查找
class Solution:
def myPow(self, x: float, n: int) -> float:
if n == 0:
return 1
elif n > 0 and n % 2 == 0:
return self.myPow(x * x, n / 2)
elif n > 0:
return self.myPow(x, n - 1) * x
else:
return 1 / self.myPow(x, -n)