目录
超级次方
描述
你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
示例 1
输入:a = 2, b = [3] 输出:8
示例 2
输入:a = 2, b = [1,0] 输出:1024
示例 3
输入:a = 1, b = [4,3,3,8,5,2] 输出:1
示例 4
输入:a = 2147483647, b = [2,0,0] 输出:1198
提示
- b 不含前导 0
方法一:递归+非快速幂
假设数组b代表的数值为K,则有
例如a=99,K=2345,那么有
同理我们可以将继续拆分下去,这样所有的幂次运算都不超过10次幂。因此可以用递归的方式进行不断分解计算。
class Solution {
int MOD=1337;
public int superPow(int a, int[] b) {
return dfs(a,b,b.length-1);
}
int dfs(int a, int[] b, int u) {
if (u == -1) return 1;
return pow(dfs(a, b, u - 1), 10) * pow(a, b[u]) % MOD;
}
public int pow(int a, int b) {
int res=1;
a%=MOD;
while (b-->0) res=res*a%MOD;
return res;
}
}
方法二:递归+快速幂
因为涉及到幂运算,所以我们可以使用快速幂的方法简化求解幂次的过程。
快速幂算法的核心思想是每次都把指数分成两半,而相应的底数做平方运算。
class Solution {
int MOD=1337;
public int superPow(int a, int[] b) {
return dfs(a,b,b.length-1);
}
int dfs(int a, int[] b, int u) {
if (u == -1) return 1;
return qpow(dfs(a, b, u - 1), 10) * qpow(a, b[u]) % MOD;
}
public int qpow(int a, int b) {
int res = 1;
a %= MOD;
while (b != 0) {
if ((b & 1) != 0) res = res * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return res;
}
}