1、快速冪
# 遞迴法
class solution:
def mypow(self, x: float, n: int) -> float:
def quickmul(n):
if n == 0:
return 1.0
y = quickmul(n // 2)
return y * y if n % 2 == 0 else y * y * x
return quickmul(n) if n >= 0 else 1.0 / quickmul(-n)
#迭代法
class solution:
def mypow(self, x: float, n: int) -> float:
def quickmul(n):
ans = 1.0
# 貢獻的初始值為 x
x_contribute = x
# 在對 n 進行二進位制拆分的同時計算答案
while n > 0:
if n % 2 == 1:
# 如果 n 二進位制表示的最低位為 1,那麼需要計入貢獻
ans *= x_contribute
# 將貢獻不斷地平方
x_contribute *= x_contribute
# 捨棄 n 二進位制表示的最低位,這樣我們每次只要判斷最低位即可
n //= 2
return ans
return quickmul(n) if n >= 0 else 1.0 / quickmul(-n)
2、矩陣快速冪
import numpy as np
def mat_pow(a, n):
m = a.shape[0]
b = np.eye(m, dtype=np.int64)
while n > 0:
if (n&1)!=0:
b = np.mod(np.matmul(b, a), self.p).astype(np.int64)
a = np.mod(np.matmul(a, a), self.p).astype(np.int64)
n >>= 1
return b
3、矩陣快速冪應用:
3.1三步問題
有個小孩正在上樓梯,樓梯有 nn 階台階,小孩一次可以上1 階、2階或 3 階。實現一種方法,計算小孩有多少種上樓梯的方式。結果可能很大,你需要對結果模 1000000007。
#不使用numpy包
class solution:
def matrixmultiply(self, a, b):
multiply =
# if len(a[0]) != len(b):
# raise valueerror
tmp = [list(row) for row in zip(*b)]
for al in range(len(a)):
row =
for bl in range(len(tmp)):
num = 0
for br in range(len(tmp[0])):
num += int((a[al][br] * tmp[bl][br])%self.p)
return multiply
def mat_pow(self, a, n):
m = len(a)
b = [[1,0,0,0,0], [0,1,0,0,0], [0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1]]
while n > 0:
if (n & 1):
b = self.matrixmultiply(b,a)
a = self.matrixmultiply(a, a)
n >>= 1
return b
def getsum(self, n):
# write code here
self.p = int(1e9+7)
if n == 1: return 1
if n == 2: return 4
f = [[4], [3], [2], [1], [1]]
a = [[1,1,1,1,1], [0,1,1,1,1], [0,0,1,1,1],[0,0,0,1,1],[0,0,0,1,0]]
b = self.mat_pow(a, n-2)
res = self.matrixmultiply(b, f)
return int(res[0][0]%self.p)
資料結構與演算法 09 矩陣快速冪
為什麼要寫矩陣快速冪呢,因為快速冪我已經寫過了,只要過載一下運算子就好了 乙個字 懶 絕對不是我懶啊。struct matrix 此處傳reference matrix operator const matrix x,const matrix y return r 矩陣快速冪 給定 n times ...
快速冪(矩陣快速冪)
求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...
快速冪 矩陣快速冪
快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...