题目描述
计算 对
1337
取模,a
是一个正整数,b
是一个非常大的正整数且会以数组形式给出。
实现示例
解题思路
1、首先看到 我觉得这道题可以用快速幂方法来实现,上一篇文章力扣50 Pow(x,n)就是用的快速幂方法;
2、其次,需要了解取模。乘法在取模意义下满足分配律:
(A×B)modC = [( AmodC )×( BmodC )] modC
同号取模与取余结果相等,所以在本题条件下上式等价于
(A×B)%C = [( A%C )×( B%C )] %C
3、由于 b 是一个数组,所以需要对其进行分解。
设数组b的长度是 i ,a的幂即 b 数组组成的整数为 x 。
则有:
那么 a 的幂就是:
4、用递归的方法进行求解。从 开始倒序计算。
实现代码
/**
* @param {number} a
* @param {number[]} b
* @return {number}
*/
var superPow = function(a, b) {
let c = 1337;
return myPow(a,b,b.length-1);
//递归
function myPow(a,b,n){
if(n===-1)return 1;
return (quickPow(myPow(a,b,n-1),10)*quickPow(a,b[n]))%c;//所有的次方都是10以内的数字
}
//快速幂函数
function quickPow(x, n){
//计算x的n次幂模1377的值,n不大于10
let ret = 1;
x %= c;
while(n!==0){
if(n%2!==0){ //幂为奇数
ret = ret * x % c;
}
x = x * x % c;
n >>= 1;
}
return ret;
};
};
时间复杂度:假设数组 b 所代表的数字是K,则时间复杂度是O(logK)
空间复杂度:O(1)