class Solution:
def myPow(self, x: float, n: int) -> float:
# 若x为0,则直接返回0
if x == 0: return 0
# 若幂为负数,则x变为倒数,n变为相反数
if n < 0: x, n = 1/x, -n
# 初始化累乘器变量为1,用于每次二分时,使用累乘来保存上一轮单出来的x
res = 1
# 当幂不为0时,进行循环二分,直至n为0结束
while n:
# 当且仅当某一个二进制位为1时,才累乘到最终的结果中
if n & 1:
res *= x
n >>= 1 # 每轮对幂n进行二分
x *= x # 二分完后,为保证原值不变,则需用x^2来代替原来的x
return res
372. (a^b对1337取模的)超级次方
class Solution:
def superPow(self, a: int, b: List[int]) -> int:
def my_pow(x, n, mod):
# 若x为0,则直接返回0
if x == 0: return 0
# 若幂为负数,则x变为倒数,n变为相反数
if n < 0: x, n = 1/x, -n
# 初始化累乘器变量为1,用于每次二分时,使用累乘来保存上一轮单出来的x
res = 1
# 当幂不为0时,进行循环二分,直至n为0结束
while n:
# 当且仅当某一个二进制位为1时,才累乘到最终的结果中
if n & 1:
res = res * x % mod
n >>= 1 # 每轮对幂n进行二分
x = x * x % mod # 二分完后,为保证原值不变,则需用x^2来代替原来的x
return res
cur_mod = 1337
res = 1
# for n in reversed(b):
for n in b[::-1]:
res = res * my_pow(a, n, cur_mod) % cur_mod
a = my_pow(a, 10, cur_mod)
return res