你的任務是計算 a^b 對 1337 取模,a 是乙個正整數,b 是乙個非常大的正整數且會以陣列形式給出。
示例 1:
輸入: a = 2, b = [3]示例 2:輸出: 8
輸入: a = 2, b = [1,0]答案:輸出: 1024
public
intsuperpow1
(int a,
int[
] b)
return res;
}int
pow(
int x,
int y)
解析:這題其實更像是一道數學題,要想解這題我們要明白這樣乙個公式
(a*b)%k=(a%k)*(b%k)%k,很好證明,這裡就不在過多解釋。上面pow函式使用遞迴的方式求解x^y,並且每次運算都會對1337求餘,舉個例子,如果求3^18,我們只需要求3^9然後再相乘即可,如果求3^9,我們只需要求3^4和3^5的乘積即可。**第4行我們把它想象成乙個陣列轉換為數字這樣乙個過程,就很容易理解了。下面我們再來看種解法
public
intsuperpow
(int a,
int[
] b)
return res;
}public
intpow
(int a,
int b,
int c)
p =(p * p)
% c;
b >>=1;
}return
(int
)(res % c)
;}
函式pow**很好理解,第15行先判斷b是否是奇數,然後再計算。superpow函式中我們首先要明白a^(bc)=(a^b)^c這樣乙個公式才能看懂上面的**,比如3^20=(3^10)^2。下面再來看最後一種解法
public
intsuperpow2
(int a,
int[
] b)
public
intpower
(int a,
int b,
int c)
p =(p * p)
% c;
b >>=1;
}return
(int
)(res % c)
;}
這種解法如果看不懂的話,可以忽略。我估計有部分同學是看不懂的,因為這裡涉及到乙個定理,叫尤拉定理,也叫費馬-尤拉定理。下面簡單提示一下
1337的因數中除了1和他本身以外,還可以分解為1337=7*191,並且7和191都是質數,也稱為素數,φ(7)=6,φ(191)=190,
所以φ(1337)=φ(7)*φ(191)=6*190=1140;
φ(a)表示的是比a小的正整數中與a互素的數的個數。
345,超級次方
你的任務是計算 a b 對 1337 取模,a 是乙個正整數,b 是乙個非常大的正整數且會以陣列形式給出。示例 1 輸入 a 2,b 3 輸出 8 示例 2 輸入 a 2,b 1,0 輸出 1024 答案 public intsuperpow1 int a,int b return res int ...
372 超級次方
你的任務是計算 ab 對 1337 取模,a 是乙個正整數,b 是乙個非常大的正整數且會以陣列形式給出。示例 1 輸入 a 2,b 3 輸出 8 示例 2 輸入 a 2,b 1,0 輸出 1024 示例 3 輸入 a 1,b 4,3,3,8,5,2 輸出 1 示例 4 輸入 a 2147483647...
372 超級次方(演算法思維系列)
你的任務是計算 a的b次方 對 1337 取模,a 是乙個正整數,b 是乙個非常大的正整數且會以陣列形式給出。主要掌握 a b k a k b k k主要思路見書355 class solution 取出最後乙個數 int last b b.length 1 更新一下b b arrays.copyo...