372. 超級次方
你的任務是計算 ab 對 1337 取模,a 是一個正整數,b 是一個非常大的正整數且會以數組形式給出。
示例 1:
輸入: a = 2, b = [3]
輸出: 8
示例 2:
輸入: a = 2, b = [1,0]
輸出: 1024
PS:
我現在飽受數學的折磨,歐拉篩,歐拉函數,
(((φ(◎ロ◎;)φ)))
class Solution {
//372超級次方
public int superPow(int a ,int[] b){
int c = 1337;
int exp = 0;
int phi = euler(c);
//同餘
for(int i=0;i<b.length;i++) exp = (exp*10+b[i])%1140;
return qucikPow(a%1337,exp,1337);
}
//快速冪計算
public int qucikPow(int a,int b,int c){
int ans =1;
while(b>0){
if((b&1)==1){
ans = (ans*a)%c;
}
b >>=1;
a = (a*a)%c;
}
return ans;
}
//歐拉函數
public int euler(int n){
int ret= n;
for(int i=2;i*i<n;i++){
if(n%i==0){//n的質因數
ret = ret/n*(n-1); //歐拉函數公式
while(n%i==0){//去掉質因數i
n/=i;
}
}
}
if(n>1){//n本來就是質數 f(n) = n-1;
ret = ret/n*(n-1);
}
return ret;
}
}