對於乙個一維的遞推式,如斐波那契數列:f(0) = 0, f(1) = 1, f(n) = f(n-1) + f(n-2), 如果想求解第n個元素,一般就是用o(n)複雜度來求解,但是這不是最優的
優化方法: 矩陣乘法+快速冪
首先可以用乙個矩陣遞推下一維,對斐波那契來說,這個矩陣就是:(1,1)(1,0). 那麼我們想求第n個數,只要把這個矩陣乘n次就好了,到這裡,複雜度還是o(n)。但是我們已經用了乙個矩陣表示,要優化就很簡單,只需要用快速冪就好,原理很簡單,舉個例子,計算2^100, 我們只需要計算2^50 * 2^50,然後不斷二分,這樣就能在logn的複雜度得到結果,**如下:
//以斐波那契數列為例
#include
#include
#define mod 10000007
using namespace std;
typedef vectorvec;
typedef vectormat;
//計算a*b
mat mul(mat &a,mat &b)
mat c(a.size(),vec(b[0].size()));
for(int i=0;ifor(int k=0;kfor(int j=0;jc[i][j]=(c[i][j]+a[i][k]*b[k][j]+mod) % mod;
return c;
//計算a^n
mat pow(mat a,long long n)
mat b(a.size(),vec(a.size()));
for(int i=0;ib[i][i]=1;
while(n>0)
if(n&1)
b=mul(b,a);
a=mul(a,a);
n>>=1;
return b;
int main()
long long n;
cin>>n;
mat a(2,vec(2));
a[0][0]=1; a[0][1]=1;
a[1][0]=1; a[1][1]=0;
a=pow(a,n);
cout< 文章原位址 第一行第一列元素為第乙個矩陣的第一行的每個元素和第二個矩陣的第一列的每個元素乘積的和 以此類推 第i行第j列的元素就是第乙個矩陣的第i行的每個元素與第二個矩陣第j列的每個元素的乘積的和。單位矩陣 n n的矩陣 mat i i 1 任何乙個矩陣乘以單位矩陣就是它本身 n 單位矩陣 n,可以... rt,主要總結一下矩陣的求法。首先能用矩陣快速冪優化的遞推型別是f n 5f n 3 6f n 2 2f n 1 n 2 n 8之類的 也就是說遞推是線性遞推且f n i 前面的係數是常數,可以含有與n有關的多項式,也可以含有常數的這種遞推,下面總結一下矩陣的寫法 先考慮最簡單的常數,我們其實可以忽... 用矩陣將快速冪可以以logn級別的時間複雜度求出遞推式 典型題 求斐波那契數列第n項 n 2 31 1 顯然 一步一步遞推o n 演算法效率不夠 0 1 0 f n 3 f n 2 0 0 1 f n 2 f n 1 1 1 3 f n 1 f n 3 f n 2 3 f n 1 在方陣右上方 n ...矩陣快速冪優化遞推式
矩陣快速冪優化遞推總結
矩陣快速冪求遞推式