345,超級次方

2022-09-18 09:42:09 字數 1654 閱讀 4536

你的任務是計算 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

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...