快速冪的學習

2021-08-28 06:47:20 字數 2832 閱讀 2421

**:

int pow(int a,int n)

return rst;

}

相信初學者都是如此求冪的,其複雜度o(n),對於資料量大時便不再適用。

我們學習複雜度時,看到logn級別的複雜度,第一時間想到的便是二分思想,快速冪也是一種二分思想減小複雜度的演算法。

** :

int fastpow(int a,int k)

int ans = 1;

while (k)

return ans;

}

舉個例子來具體說明此**: 3^11

首先,將11寫作二進位制,即1011.則

所以**中的 (k&1) 即是取最後一位,如果是1,就 *a . 而每次 a *= a,則是 每位對應的 3 ^ 1 , 3 ^ 2 , 3 ^ 4……

而**中的 k>>=1 ,則是右移一位,保證每次取的都是新的最後一位。

我們打表來觀察一下計算 3^11的各個變數的具體值:

可以比較清晰的看出其中的每一步的變化。

首先是簡單的矩陣a的k次方的計算。從上面的整數的k次方計算可知,矩陣的k次方也是按照二進位制計算,不同的是需要過載矩陣的乘法運算即可。

1、矩陣結構體的定義

struct matrix

}matrix

(int n)

n = n;

clear()

;}void

unit()

}void

display()

cout<

void

operator=(

const matrix& tmp)

const}}

matrix operator*(

const matrix& tmp)

const}}

return ans;}}

;

2、接下來定義好矩陣結構體,並過載運算子之後,只要把快速冪裡的 int a, 換為 matrix a 即可。

matrix fastpow

(matrix base,

int k)

while

(k)return ans;

}

hdu 5015

分析都大同小異,在此只放上**以及出現的錯誤

1、**:

#include

using

namespace std;

#define mem(a,b) memset(a,b,sizeof(a))

#define f first

#define s second

#define pb push_back

#define mk make_pair

typedef

long

long ll;

const

int maxn =10+

5;const

int mod =

1e7+7;

struct matrix

cout<

};matrix mulmatric

(matrix a, matrix b,

int p)}}

return ans;

}matrix fastpow

(matrix a,

int k,

int p)

matrix ans;

ans.row = a.row;

ans.col = a.col;

mem(ans.mat,0)

;for

(int i =

0; i < a.row; i++

)while

(k)return ans;

}int n,m;

intmain()

a.row = a.col = n+2;

mem(a.mat,0)

;for

(int i =

0;i < n+

1;i++

) a.mat[i][0

]=10;

for(

int i =

0;i <= n+

1;i++

) a.mat[i]

[n+1]=

1;for(

int i =

1; i <= n; i++)}

ans =

fastpow

(a,m,mod)

; ans =

mulmatric

(ans,b,mod)

; cout<

]<

}return0;

}

2、出現的錯誤

(1)特別特別要注意下標,因為此題中的關係矩陣是乙個 (n+2) * (n+2) 的矩陣

(2)注意在快速冪函式,以及矩陣乘法函式中,每次宣告 matrix ans,都要給其行和列賦值。並且每次都要初始化,不然都不預設是0.

矩陣快速冪題目的難點一般是找關係方程,不會直接讓你求乙個矩陣的幾次方。此題求冪和上面不同的是,乘法是矩陣乘法的一般形式,即 (n,k) 矩陣乘以 (k,m) 矩陣。除此之外還要注意的是取模運算的位置

快速冪 快速矩陣冪學習

快速冪學習 計算3 11 如果用傳統計算,則是 for i 11 s 3 速度為n 這裡利用快速冪思想 3 11 3 1 3 2 3 8 3 1的平方就是3 2,再平方就是3 8 最後再將他們乘起來就是求出來的數了,速度也達到了log n 演算法中我們可以先判斷冪指數是否為奇數,先乘乙個3,然後對剩...

快速冪的初步學習

快速冪的用處很多,常見的問題有快速冪取模和矩陣快速冪,一般的問題套用模板就可以。快速冪的思想是分治,類似於二分,所以時間複雜度是o n 推薦一篇很好的文章 fzu 1752 a bmoc c 題意 given a,b,c,you should quickly calculate the result...

快速冪 普通快速冪 矩陣快速冪

題意 n個人排隊,f表示女,m表示男,包含子串 fmf 和 fff 的序列為o佇列,否則為e佇列,有多少個序列為e佇列。分析 矩陣快速冪入門題。下面引用巨巨解釋 用f n 表示n個人滿足條件的結果,那麼如果最後乙個人是m的話,那麼前n 1個滿足條件即可,就是f n 1 如果最後乙個是f那麼這個還無法...