问题:
斐波那契数列由如下递推关系式定义:F(0) = 0,F(1)=1,F(n)=F(n-1)+F(n-2) if n>1。
解法:
斐波那契数列是二阶递推数列,所以存在一个2*2的矩阵A,使得:
(Fn, Fn-1) = (Fn-1, Fn-2)*A
求得A=(1 1)
(1 0)
那么求数列的第n项就是等于求矩阵A的第n-1次幂,计算的速度非常快,时间复杂度为O(logn)。
首先我们用long long 型表示数列中的元素,它只能表示20位的整数,能表示的范围太小,最多第92个元素。
#include <iostream>
#include <cassert>
using namespace std;
const int MAXLENGTH = 10;
struct Matrix
{
unsigned side;
long long dat[MAXLENGTH*MAXLENGTH];
};
// 方阵的乘法
void MatrixMult(const Matrix a, const Matrix b, Matrix &m)
{
assert(a.side == b.side);
m.side = a.side;
for (int i=0; i<m.side; ++i)
for (int j=0; j<m.side; ++j)
{
m.dat[i*m.side&#