原题链接
题目描述
示例
输入:a = 2, b = [3]
输出:8
输入:a = 2, b = [1,0]
输出:1024
参考解法
/**
* 模幂运算
* @param a
* @param b
* @return
*/
public int superPow(int a, int[] b) {
int n = b.length;
if (n <= 0)
return 1;
ArrayList<Integer> arr = new ArrayList<>();
for (int value : b) {
arr.add(value);
}
return solve(a, arr);
}
private int solve(int a, ArrayList<Integer> arr) {
if (arr.isEmpty())
return 1;
// 取出最后一个数
int last = arr.get(arr.size() - 1);
arr.remove(arr.size() - 1);
// 通过递归缩小规模
int part1 = mypow(a, last);
int part2 = mypow(solve(a, arr), 10);
return (part1 * part2) % base;
}
int base = 1337;
// (a*b)%k = (a%k)*(b%k)%k
/**
* a的k次方对base取模
* @param a
* @param k
* @return
*/
private int mypow(int a, int k) {
a = a % base;
int res = 1;
for (int i = 0; i < k; i++) {
res = res * a;
res = res % base;
}
return res;
}
总结
为了避免溢出,(a*b)%k
可以转化成(a%k)*(b%k)%k
。
相似的操作还有(l+r)/2
转化成l+(r-l)/2
。