地址:372. 超级次方 - 力扣(LeetCode) (leetcode-cn.com)
乍眼一看a的b次方,还真没想起来快速幂,但由于这道题b的长度为2000,无法直接使用快速幂,但本质还是分治的思想,快速幂的思想为把b化为二进制,然后用位运算,如果为1则乘。
由于b的长度过长,可以把b分为,b%10... , b%100,b%10,例如当b为二百是,先计算个位,然后十位,百位等。
class Solution {
public:
int superPow(int a, vector<int>& b) {
if(b.empty()) return 1;
auto res = 1;
for(int i = b.size() -1 ; i >= 0; i--){
res = powmod(a , b[i])*res % 1337;
a = powmod(a,10);
}
return res;
}
int powmod(int a, int b){
int res = 1;
a %= 1337;
while (b > 0){
if(b & 1) res = (res*a)%1337;
a = a*a % 1337;
b >>= 1;
}
return res;
}
};