**:
【快速冪】o(logn)時間複雜度
#include#includeusing namespace std;
int qpow(int base, int n)
return ans;
}int main()
【矩陣快速冪】該演算法只適用於方陣
設 a 為方陣 , 快速求 a n 的演算法
【應用】求遞推式的第n項,例如
斐波那契 遞推公式 f(n) = f(n-1) + f(n-2)
可以轉換成以下矩陣運算:
由上述遞推式我們可以求出矩陣
因此原本求 f(1000) 需要遞推1000次,時間複雜度為o(n)
用矩陣快速冪,求f(1000, 999) = f(2, 1) * a1000 設方陣階數為m,矩陣相乘相乘時間複雜度為 o(m3),矩陣快速冪為o(logn)
則計算8*log21000 < 1000
【模板】
/*
矩陣快速冪模板
by chsobin
*/#include#include#includeusing namespace std;
const int maxn = 2;
const int mod = 10000;
//矩陣結構體
struct matrix{
int a[maxn][maxn];
void init(){ //初始化為單位矩陣
memset(a, 0, sizeof(a));
for(int i=0;i【例題】
hdu 1575 模板題
**:
快速冪與矩陣快速冪
1 結論 a b mod c a mod c b mod c mod c a b c a c b c 2 先這樣理解一下 int ans 1 a a c if b 2 1 ans ans a c k a a c for i 0 i return ans c 我們把式子轉化成k b 2 modc 所以...
快速冪與矩陣快速冪
快速冪,顧名思義要快速解決數冪問題 樸素演算法中時間複雜度為o n 在處理大數冪時顯然會爆,這時要使用到快速冪的思想。對於乙個數的6方a 6們通常使用a a a a a a,此時計算機進行5乘法運算,但我們可以將其拆分為 a a a a a a 這樣做的優點在於當我們進行一次a a運算後,只需將其乘...
快速冪與矩陣快速冪
如果當前的指數是偶數,我們把指數拆成兩半,得到兩個相同的數,然後把這兩個相同的數相乘,可以得到原來的數 如果當前的指數是奇數,我們把指數拆成兩半,得到兩個相同的數,此時還剩餘乙個底數,把這兩個相同的數和剩餘的底數這三個數相乘,可以得到原來的數。求解x 的值 int quickpow int x,in...