题目链接
分析:b数组可以看成一个超级大的正数,那么就是求a的b次方,然后对1337取模。
假设b = 4321,a=3
知识点:快速幂,取模分配律
取模分配律:
(a⋅b) * mod m = [ (a mod m) * ( b mod m) ] mod m
第一步:拆分b这个超级大数
那么3的4321次方,也就是3的1次方,3的20次方,3的300次方,3的4000次方,然后再相乘。
第二步:快速幂
3的4000次方,可以拆分为3的1000次方,然后再4次方。
3的1000次方3平方的500次方
也就是3平方的平方的250次方 。。。。。一直下去即可。
第三步:取模分配律
存下来( b mod m) 和 (a mod m),再mod 1337
代码:
class Solution {
public int Mod = 1337;
public int superPow(int a, int[] b) {
int len = b.length;
int res = 1;
for(int i = len-1 ; i >=0; i--){
// 计算a 的bi次方
res = (int) ((long) res * pow(a, b[i]) % Mod);
//本来是下一个bi乘10。。00 权重个0,这里转移到a中去,也就是 a 的bi*10..00次方,可以写为a的10..00次方的 bi次方。
a = pow(a,10);
}
return res;
}
public int pow(int x, int n) {
int res = 1;
//快速幂
while (n != 0) {
if (n % 2 != 0) {
//计算 [ (a mod m) * ( b mod m) ] mod m
res = (int) ((long) res * x % Mod);
}
//计算 ( b mod m)
x = (int) ((long) x * x % Mod);
n /= 2;
}
return res;
}
}