矩陣乘法快速冪 斐波那契數

2021-10-03 11:51:29 字數 1094 閱讀 8157

矩陣運算 + 快速冪。

快速冪演算法的模板可以參考這裡。

用演算法4我們1秒內最多可以算到 108

級別,那當 n 更大時該怎麼辦呢?

可以先利用矩陣運算的性質將通項公式變成冪次形式,然後用平方倍增(快速冪)的方法求解第 n

項。首先我們定義向量

xn=[anan−1],邊界:x1=[a1a0]

然後我們可以找出矩陣:

a=[1110]

則有:xn=xn−1×a

所以:xn=x1×an−1

由於矩陣具有結合律,所以我們可以先求出 an−1%p

,然後再用 x1 左乘,即可求出 xn,向量 xn 的第乙個元素就是 an

時間複雜度分析:快速冪的時間複雜度是 o(logn)

,所以演算法5的時間複雜度也是 o(logn)。

。根據斐波那契數項之間的關係構造矩陣。

矩陣形如。

#includeusing namespace std;

const int n=3;

int n,m;

int a[n][n]=,,

},f[n]=

;void mul1(int a,int b[n],int c)

;for

(int i=0;i;i++)

for(int j=0;j;j++)

temp[i]=(temp[i]+(long long)a[j]*b[j][i])%m;

memcpy

(c,temp,sizeof temp);}

void mul2(int a[n],int b[n],int c[n])//第二維大小要定義

;for

(int i=0;i;i++)

for(int j=0;j;j++)

for(int k=0;k;k++)

temp[i][j]=(temp[i][j]+(long long)a[i][k]*b[k][j])%m;

memcpy

(c,temp,sizeof temp);}

int main()

cout<;

return 0;

}

斐波那契(矩陣快速冪)

斐波那契數列,即fib n fib n 1 fib n 2 fib n fib n 1 fib n 2 fib n fib n 1 fi b n 2 就這麼乙個數列,顯然可以直接遞推求解,時間複雜度o n o n o n 似乎沒什麼問題。然後就遇到了這個,n nn的取值範圍最大是2 1 09 2 t...

矩陣快速冪 斐波那契數列

time limit 1000 ms memory limit 128 mb 通過小l的不懈努力,他即將成為大神啦,他登上了大神專屬的頒獎臺。在頒獎台上,他即將領取代表著大神的無限榮譽的勳章。小l走上頒獎台後,在台上發現了乙個製作精美的盒子。榮譽勳章就在盒子裡面。小l發現這個盒子被上了鎖,在這個盒子...

矩陣快速冪 斐波那契數列

先來實現乙個矩陣相乘的函式吧。const int mod 10000 struct mat mat mat mul mat x,mat y 實現兩個矩陣相乘,返回的還是乙個矩陣。return res 其實和普通快速冪類似,只不過這裡需要得到的是乙個矩陣下面來實現乙個矩陣快速冪 int pow int...