思路:这道题实际是求a^b mode c的结果,因为大数取模时具有如下特征:a^b mod c = (a mod c)^c,也就是说在任何时候取模都可以。
那么我们可以计算出前10个数的计算结果,即a^0 mod 1337,,,,a^10 mod 1337。并保持到数组中。
然后对于指数b = b’ * 10 + b”,即a^b = a^(b’10 + b”) = (a^10) ^ b’ a^b” mod 1337。而这里a^10已经计算出来了,a^b”也包含在数组里面。然后我们注意到(a^10,b’)完全可以递归计算。
代码如下:
public class Solution {
public int superPow(int a, int[] b) {
if(a == 1 || b.length == 0)
return 1;
a = a % 1337;
int[] nums = new int[11];
int prev = 1,i = 0;
while(i <= 10){//至于为什么是10,因为更多的话会浪费空间,更小的话,会增加递归层数,至于10是否最优,没有测量。
nums[i++] = prev;
prev = prev * a % 1337;
}
int[] divisor = new int[b.length - 1];
int remainder = divide(b,10,divisor);
return superPow(nums[10],divisor)*nums[remainder]%1337;
}
private int divide(int[] num,int baseNum,int[] divisor){
System.arraycopy(num,0,divisor,0,divisor.length);
return num[num.length - 1];
}
}