LeetCode 372. 超级次方
题目:
给定正整数a,大整数b(数组),求\(a^b\mod1337\)
思路:
稍微思考一下就知道要用快速幂来求,和平时不一样的是,这道题的幂次是以十进制表示的,所以更烤鸭做题者对于快速幂本身的理解。我们以\(a^{345}\)为例,\(a^{345}=a^{3*10^2+4*10^1+5*10^0}=(a^{10^2})^3*(a^{10^1})^4*(a^{10^0})^5\),我们每轮循环需要用base算幂次再更新base(10次方)。
代码:
class Solution {
public:
int superPow(int a, vector<int>& b) {
a = a % mod;
int base = a;
int ans = 1;
for (auto i = b.rbegin(); i != b.rend(); i++) {
int temp = 1, j = 0;
for (; j < *i; j++) { //计算base^(*i)
temp = (temp * base) % mod;
}
ans = (ans * temp) % mod;
for (; j < 10; j++) { //原来已经算了*i次了,这里讲temp继续算下去,减少计算次数
temp = (temp * base) % mod;
}
base = temp;
}
return ans;
}
int mod = 1337;
};