Problem
Your task is to calculate a b a^b ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array.
Example 1:
Input: a = 2, b = [3]
Output: 8
Example 2:
Input: a = 2, b = [1,0]
Output: 1024
解题思路
这一题其实很简单,首先我们可以对底数模1337,这样可以简化问题。这一步很容易理解,接下来,我们来考虑指数,由于给定的指数是一个很长很长的列表,不妨先假设这个列表有只包含两个数字,即
[
b
0
,
b
1
]
[b_0, b_1]
[b0,b1]。那么,我们的最后的数据就应该是:
a
b
0
∗
10
+
b
1
=
(
a
b
0
)
10
×
a
b
1
a^{b_0 * 10 + b_1} = (a^{b_0})^{10} \times a^{b_1}
ab0∗10+b1=(ab0)10×ab1
那么当我们对指数进行操作时,就是对当前的数据进行求10次方,然后和下一位的指数相乘即可。类似的,当我们的列表包含三个数字时即
[
b
0
,
b
1
,
b
2
]
[b_0, b_1, b_2]
[b0,b1,b2],我们需要这样操作:
a
b
0
∗
100
+
b
1
∗
10
+
b
2
=
(
(
a
b
0
)
10
×
a
b
1
)
10
×
a
b
2
a^{b_0 * 100 + b_1 * 10 + b_2} = ((a^{b_0})^{10} \times a^{b_1}) ^ {10} \times a^{b_2}
ab0∗100+b1∗10+b2=((ab0)10×ab1)10×ab2
从上面的式子可以看出,我们可以先求出前两位数组成的数字的指数次方,在进行求10次方的操作,再和第三个数的次方相乘即可。以此类推,可以求出后面所有的数字的次方。需要注意的是这里有一个模1337的操作,防止数据过大。
代码如下:在代码中对求指数操作进行了一定的封装。
class Solution:
def pow(self, a, b):
base = a % 1337
a = 1
for i in range(b):
a = base * a
a = a % 1337
return a
def superPow(self, a: int, b) -> int:
base = a % 1337
a = self.pow(base, b[0])
for i in range(1, len(b)):
a = self.pow(a, 10)
a = (a * self.pow(base, b[i])) % 1337
return a