wiki
快速冪也稱為平方求冪(exponentiating by squaring)
快速冪時計算乙個數的大正整數乘冪的一般方法(對多項式,矩陣也適用)
\[x^n =
\begin
x(x^2)^}, & \text \\
(x^2)^}, & \text
\end
\]平方法轉換思想:
將指數的位,二進位制的位,來確定計算哪些冪
\[x = a * b ^n
,x= a * (b^2)^}
\]每次把b進行平方,將n看作乙個二進位制的數,如果k位為1,則最後的結果需要乘上 b(2k)
b= 13(1101)
\[x = b^
,= b^1 * b^ * b^8
\]**實現:
# a * b^n
def quickpower(a,b,n):
x = a
p = b
while n >0:
if(n & 1) == 1:
x = x * p
p = p * p # p,p^2,p^4,p^8
n = n >> 1
return x
// b^n
int mod = 10e9;
long long power(long long p,long long n)
}
計算大指數冪除以乙個數的餘數,在密碼學中應用較多
leetcode.372超級次方
// a^b % mod
// b是以乙個大數,儲存在陣列中
class solution
private int dfs(int a,int b,int len)
private int quickpow(int a ,int b)
return ans;
}}
快速冪在動態規劃中的應用
動態規劃主要用來解決兩種問題:
快速冪可以在組合計數問題中,對計算進行加速(時間複雜度從 o(n) -> o(logn))
[leetcode.1411]
\[dp[i][0] = dp[i-1][0] * 3 + dp[i-1][1] * 2
,dp[i][1] = dp[i-1][0] * 2 + dp[i-1][1] * 2
\]邊界條件
\[dp[1][0] = dp[1][0] = 6
\]
int numofways(int n)
return (dp[n][0] + dp[n][1]) % mod;
}
轉換為矩陣求解
\[(dp[i][0],dp[i][1]) = (dp[i-1][0] ,dp[i-1][1]) * \begin
3&2\\
2&2\\
\end
,(dp[n][0], dp[n][1] = (dp[1][0] , dp[1][1])* \begin
3&2\\
2&2\\
\end ^
\]
class solution }; // 1x2
vector> m,}; // 2x2
auto mul = [kmod](const vector>& a,
const vector>& b) ;
--n;
while (n)
// ans = ans0 * m^(n-1)
return (ans[0][0] + ans[0][1]) % kmod;
}};
快速冪模板及對其的理解
下面先貼上學長教的快速冪模板 typedef long long ll ll qpow ll a,ll b,ll mod a a a mod b 1 return ans 那麼這個快速冪是如何實現的呢?原理就是將a b拆分掉,拆分成若干部分,每一部分a的指數都是2的n次方的格式,下面是乙個例子 就像...
快速冪及快速冪取餘
快速冪 當遇到求 a na n an這種問題時,可以將指數n拆開於是變成 a2 n 2 a 2 a2 n 2。然後重複將n除2,底數平方,直到指數為0為止就是結果。於是解決這題的時間複雜度從 o n o n o n 普通迴圈相乘a的做法 到了 o l ogn o logn o logn 這就是快速冪...
初學 快速冪 的理解
部落格停了差不多三個月,雖然這一段時間在學演算法,但從來沒有寫部落格。今天看了一上午的快速冪,突然想寫寫部落格,增加一下自己的記憶!這個博文知識簡單介紹一下演算法中取餘的原因 1至於快速冪的概念不詳細記錄了。當我們想求a的b次冪對c取余時,我們會直接想到用這個演算法 int ans 1 for i ...