你的任务是计算 a^b 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。
示例 1:
输入: a = 2, b = [3]
输出: 8
示例 2:
输入: a = 2, b = [1,0]
输出: 1024
思路:典型的降幂公式算法,回顾了一下以前学过的降幂公式。
不懂的人可以看我这篇详解:降幂公式讲解
class Solution {
public int superPow(int a, int[] b) {
int c=ol(1337);
int sum=0;
for(int i=0;i<b.length;i++)
sum=(sum*10+b[i])%c;
sum+=c;
return q((long)a,sum,1337);
}
private int q(long x,int y,int M) {
long res=1;
while(y>0) {
if(y%2>0)
res=res%M*x%M;
x=x%M*x%M;
y/=2;
}
return (int)res;
}
private int ol(int x) {
int res=x;
for(int i=2;i*i<=x;i++) {
if(x%i==0) {
res=res-res/i;
while(x%i==0)
x/=i;
}
}
if(x>1) res=res-res/x;
return res;
}
}