被这道题折磨的死去活来,果然菜是原罪,找资料各种补啊,要感谢下面三处
1.参考视频链接:小Q刷Leetcode第27期 365-373
https://www.bilibili.com/video/av14125208/?p=5
只用了第十二分钟左右的方法,后面那个什么欧拉什么的直接放弃了,看不懂,最后有个按十进制位做的,倒是也可以,但是java和c++可能实现上稍有不同把,不太懂
2.关于快速幂框架可以参考LeetCode 372. Super Pow解题思路(超详细)
https://blog.csdn.net/beyond702/article/details/53222077#commentBox
但是最后那个的代码是过不去的,就不要浪费时间看了,主要是我太菜也没看懂
3.最后这个是比较牛逼的做法了,文章中还有关于欧拉函数是实现,先mark一下,刚开始那个数组我确实不明白为什么要%2又/2之类的,这篇算是讲到了本质吧,LeetCode 372. Super Pow
https://www.cnblogs.com/micrari/p/5739769.html#undefined
下面就是最后用的过的代码了,其实基本上就是把第一个视频中的代码改成了java版本,所以还是感谢nat8023
class Solution {
public static final int mod = 1337;
public static int superPow(int a, int[] b) {
a = a % mod;
int left = 0,right = b.length - 1;
int res = 1;
//以下为快速幂
for(int mul = a ; left <= right ; ){
if( b[right]%2==1){
res = res * mul % mod;
}
//以下为手动除法
int inc = 0;
int newinc = 0;
for(int i = left ; i <= right ;i++,newinc = 0){
if((inc*10 + b[i]) % 2 == 1){
newinc = 1;
}
b[i] = (inc*10 + b[i]) / 2;
inc = newinc;
}
//手动除法完毕
//过滤前导0
while(left <= right && b[left] == 0){
left++;
}
//过滤前导0完毕
mul = mul*mul%mod;
}
return res;
}
}
执行用时: 254 ms, 在Super Pow的Java提交中击败了14.77% 的用户
还是有些尴尬的,算了,以后再说,先过了再说吧