具体思路:
快速幂的提升版本;
运用了指数分配律和快速幂知识;
推导如下:
a
b
1
b
2
b
3
=
a
b
1
∗
1
0
2
+
b
2
∗
1
0
1
+
b
3
∗
1
0
0
=
a
b
1
∗
1
0
2
∗
a
b
2
∗
1
0
1
∗
a
b
3
∗
1
0
0
a^{b_1b_2b_3}=a^{b_1*10^2+b_2*10^1+b_3*10^0}=a^{b_1*10^2}*a^{b_2*10^1}*a^{b_3*10^0}
ab1b2b3=ab1∗102+b2∗101+b3∗100=ab1∗102∗ab2∗101∗ab3∗100
因此,从循环角度来看,我们每一个循环的快速幂需要算两部分:
- 10的n次方;
- a的m次方;
快速幂则是采用二进制来进行计算;
具体代码:
using ll=long long;
class Solution {
public:
int superPow(int a, vector<int>& b) {
int mod=1337;
int ret=1;
for(int i=b.size()-1;i>=0;i--){
ret=ret*cnt(a,b[i]);
ret%=mod;
a=cnt(a,10);
}
return ret;
}
int cnt(int a,int b){
int ret=1;
ll cnt=a;
while(b!=0){
if(b%2==1){
cnt%=1337;
ret=(ret*cnt)%1337;
}
b/=2;
cnt=(cnt*cnt)%1337;
}
return ret;
}
};