0372. 超级次方【中等】
1. 📝 题目描述
你的任务是计算 a^b 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
示例 1:
txt
输入:a = 2, b = [3]
输出:81
2
2
示例 2:
txt
输入:a = 2, b = [1,0]
输出:10241
2
2
示例 3:
txt
输入:a = 1, b = [4,3,3,8,5,2]
输出:11
2
2
示例 4:
txt
输入:a = 2147483647, b = [2,0,0]
输出:11981
2
2
提示:
1 <= a <= 2^31 - 11 <= b.length <= 20000 <= b[i] <= 9b不含前导 0
2. 🎯 s.1 - 快速幂
c
long long powMod(long long base, int exp, int mod) {
base %= mod;
long long result = 1;
while (exp > 0) {
if (exp % 2 == 1) result = result * base % mod;
base = base * base % mod;
exp /= 2;
}
return result;
}
int superPow(int a, int* b, int bSize) {
int mod = 1337;
long long result = 1;
for (int i = 0; i < bSize; i++) {
result = powMod(result, 10, mod) * powMod(a, b[i], mod) % mod;
}
return (int)result;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
js
/**
* @param {number} a
* @param {number[]} b
* @return {number}
*/
var superPow = function (a, b) {
const MOD = 1337
const powMod = (base, exp) => {
base %= MOD
let result = 1
while (exp > 0) {
if (exp % 2 === 1) result = (result * base) % MOD
base = (base * base) % MOD
exp = Math.floor(exp / 2)
}
return result
}
let result = 1
for (const digit of b) {
result = (powMod(result, 10) * powMod(a, digit)) % MOD
}
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
py
class Solution:
def superPow(self, a: int, b: List[int]) -> int:
MOD = 1337
result = 1
for digit in b:
result = pow(result, 10, MOD) * pow(a, digit, MOD) % MOD
return result1
2
3
4
5
6
7
2
3
4
5
6
7
- 时间复杂度:
,其中 是数组 的长度 - 空间复杂度:
算法思路:
,逐位处理指数- 每一位用快速幂取模计算,避免大数溢出