题目:https://leetcode-cn.com/problems/super-pow/submissions/
给一个整数a,一个非常大的整数b,b用数组形式给出,求a的b次方对1337取余。
用到取余的分配率。
把a的b次方用数学公式分解。递推求解。
class Solution {
public int superPow(int a, int[] b) {
int m = b.length;
int ans = pow(a, b[m-1], 1337);
for(int i = m - 2; i >= 0; i--){
a = pow(a, 10, 1337);
ans = (ans * pow(a, b[i], 1337)) % 1337;
}
return ans;
}
int pow(int a, int b, int c){
a = a % c;
int ans = 1;
for(int i = 0; i < b; i++){
ans = (ans * a) % c;
}
return ans;
}
}
以上是我的做法。
官方题解中提到要用快速幂求解,如下:
class Solution {
public int superPow(int a, int[] b) {
int m = b.length;
int ans = pow(a, b[m-1], 1337);
for(int i = m - 2; i >= 0; i--){
a = pow(a, 10, 1337);
ans = (ans * pow(a, b[i], 1337)) % 1337;
}
return ans;
}
int pow(int a, int b, int c){
a = a % c;
if(b == 0) return 1;
if(b % 2 == 0){
return powTwo(pow(a, b / 2, c), c);
}else {
return (powTwo(pow(a, b / 2, c), c) * a) % c;
}
}
int powTwo(int a, int c){
return (a * a) % c;
}
}