公式1: 两数乘积之模的拆分
(a * b) % k = (a % k)(b % k) % k
公式2: 某数的n次幂取模的拆分
a^n % k = (a % k)^n % k
递归
公式1: 两数乘积之模的拆分
(a * b) % k = (a % k)(b % k) % k
公式2: 某数的n次幂取模的拆分
a^n % k = (a % k)^n % k
比如假设a=2 b=[1, 2, 3]
其实就是求a ** 123 % 1337
根据幂运算的规律,可以把幂运算拆成两数相乘的形式:
a ** 123 = (a ** 3) * (a**120)
= (a ** 3) * ((a**12) ** 10)
利用公式1把上面那个式子拆成两部分:
part1 = a ** 3 % 1337
part2 = (a ** 12) ** 10 % 1337
利用公式2,继续拆分part2
part2 = (a ** 12 % 1337) ** 10 % 1337
那最终的结果就变成:
(part1 * part2) % base
可以看到,在利用公式2拆分的时候,有一步是:
(a ** 12 % 1337)
这其实就是(a ** 123 % 1337)的简化版本,所以这里用递归来解决问题
class Solution: def superPow(self, a: int, b: List[int]) -> int: base = 1337 if not b: return 1 last = b.pop() part1 = (a ** last) % base part2 = (self.superPow(a, b) ** 10) % base return (part1 * part2) % base
原文:https://www.cnblogs.com/zhaojiayu/p/14801733.html