如果當前的指數是偶數,我們把指數拆成兩半,得到兩個相同的數,然後把這兩個相同的數相乘,可以得到原來的數;
如果當前的指數是奇數,我們把指數拆成兩半,得到兩個相同的數,此時還剩餘乙個底數,把這兩個相同的數和剩餘的底數這三個數相乘,可以得到原來的數。
求解x^n的值
首先,我們注意到,不管當前的指數值(n 的值)是奇數還是偶數,一次運算之後 n 都要拆成兩半(n /= 2),所以,我們在每次運算的時候都要讓當前的 x *= x ,也就是執行 x = x^2,這點相信不難理解。int quickpow(int x,int n)
x*=x;
n = n>>1;
}return ans;
}
第二,當 n 為奇數的時候,如果執行 n /= 2,結果會使得 n 損失乙個 1。舉個例子:假設此時 n = 9,9 / 2 = 4 ,即使我們之後會執行 x *= x,也只是把 n 的一半 (4) 補回來了,還少了個 1 (4+4+1 = 9)。因此此時要把少了的那乙個 x 存入結果中,即為執行 ans *= x;
第三,只要 n 的初始值是大於 0 的(其餘的數需要特殊處理),那麼在運算過程中一直執行 n >>= 1,也就是將 n 除以 2 ,n 是一定會等於 1 的,此時執行 ans *= x,將最後的結果儲存在 ans中,之後退出迴圈。
最後,整個迴圈每一次執行 n 都變成原來的一半,當 n 等於 0 的時候結束,時間複雜度為 o(logn)。
矩陣快速冪是用於快速求出乙個矩陣的 n 次方的方法。
首先,兩個矩陣能不能相乘是有一定條件的: 矩陣 a 的列數等於矩陣 b 的行數。
對於這裡,我們要求的是乙個矩陣的 n 次方,那麼既然是同乙個矩陣,那麼只有當其為方陣的時候,才可以相乘。
struct matrix ///結構體,矩陣型別
ans,res;
matrix mul(matrix a,matrix b,int n)
}for(itn i=1;i <= n;i++)}}
return tmp;
}///矩陣快速冪,求矩陣res的n次冪
void quickpower(int n,int n)
}while(n)
}
快速冪與矩陣快速冪
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運算後,只需將其乘...
快速冪與矩陣快速冪
快速冪 o logn 時間複雜度 include includeusing namespace std int qpow int base,int n return ans int main 矩陣快速冪 該演算法只適用於方陣 設 a 為方陣 快速求 a n 的演算法 應用 求遞推式的第n項,例如 斐...