Fibonacci數列的矩陣運算

2021-06-21 13:52:08 字數 1495 閱讀 6404

fibonacci數列這一族的acm層出不窮,屢屢坑爹,每次好容易看出是它結果又死在o(n)演算法上

下面貼出來的是fibonacci數列的o(log n)的矩陣演算法

# include typedef long long ll;

typedef struct valuepair

}valuepair, vp;

class matrix

;matrix calculate(const int &);

void getans(const int &);

int main(int argc, char const *argv)

getans(ntime);

}return 0;

}matrix calculate(const int &ntime)

else

else

}}void getans(const int &ntime)

matrix::matrix()

matrix::matrix(const matrix &matrix)

const matrix matrix::operator=(const matrix & matrix)

matrix::~matrix()

void matrix::operator*=(const matrix &matrix)

ll matrix::getltv() const

ll matrix::getldv() const

ll matrix::getrtv() const

ll matrix::getrdv() const

vp matrix::operator*(const vp &vp)

matrix matrix::operator*(const matrix &matrix)

std::ostream & operator<<(std::ostream &stream, const matrix &matrix)

主要用到的思想便是矩陣的快速冪(acm通常跟著坑爹的求模運算,這時候就看你數論的了)

這裡需要提一下的就是

matrix calculate(const int &ntime)

else

else

}}

千萬不要偷懶寫成

matrix calculate(const int &ntime)

else

else

}}

不然真心逗了,不如直接算的,更慢更耗空間。

而對於寫類的孩紙們,這裡的重寫等號函式並未申請空間,當是真正的二維陣列的時候,記得delete其指標和正確的析構函式,不然記憶體怎麼爆的都不知道

const matrix matrix::operator=(const matrix & matrix)

fibonacci數列矩陣快速冪

對於矩陣 1 1 1 0 的n次冪,第一行第二個元素 右上角 的元素即為fibonacci數列的第n項,由此可以根據矩陣的乘法計算fibonacci數列的元素值 矩陣的快速冪利用的也是冪乘的二分法,只不是換成了矩陣的乘法,可以用函式處理。可以定義乙個二維陣列的結構體 typedef struct m...

優美的Fibonacci數列與矩陣

題目 題意 給定fibonacci數列f,令 分析 對於fibonacci數列的題目來說一般要構造矩陣。那麼本題應該怎樣解決?首先我們設 因為所以得到 那麼,我們繼續有 然後我們可以構造矩陣了。如下 到了這裡,本題完美解決!include include include using namespac...

Fibonacci數列(矩陣乘法快速冪)

題目描述 定義 f0 f1 1,fn fn 1 fn 2 n 2 稱為fibonacci數列。輸入n,求fn mod q。其中1 q 30000。輸入描述 第一行乙個數t 1 t 10000 以下t行,每行兩個數,n,q n 109,1 q 30000 輸出描述 檔案包含t行,每行對應乙個答案。樣例...