python資料結構 快速冪 矩陣快速冪 應用

2021-10-08 16:24:51 字數 3921 閱讀 7115

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