算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数
題目分析
來源:acwing
分析:
先利用矩陣運(yùn)算的性質(zhì)將通項(xiàng)公式變成冪次形式,然后用快速冪的方法求解第 n項(xiàng)。
斐波那契數(shù)列的遞推公式:f1=f2=1,fn=fn?2+fn?1(n≥3)f_1 = f_2 =1, f_n = f_{n-2} + f_{n-1}(n \geq3)f1?=f2?=1,fn?=fn?2?+fn?1?(n≥3)
定義向量 Fn=[fn,fn+1,Sn]F_n = [f_n, f_{n +1}, S_n]Fn?=[fn?,fn+1?,Sn?],其中fnf_{n }fn?和fn+1f_{n +1}fn+1? 分別表示斐波那契數(shù)列的第n項(xiàng)和第n+1項(xiàng),而且SnS_nSn?表示斐波那契數(shù)列的前n項(xiàng)和。則F1=[f1,f2,S1]=[1,1,1]F_1 = [f_1, f_{2}, S_1] =[1,1,1]F1?=[f1?,f2?,S1?]=[1,1,1]
我們要找到遞推關(guān)系式,即找到 Fn+1=[fn+1,fn+2,Sn+1]F_{n+1} = [f_{n+1}, f_{n +2}, S_{n+1}]Fn+1?=[fn+1?,fn+2?,Sn+1?]和 Fn=[fn,fn+1,Sn]F_n = [f_n, f_{n +1}, S_n]Fn?=[fn?,fn+1?,Sn?]的關(guān)系
我們找到矩陣A=[010111001]A=\begin{bmatrix} 0 & 1 & 0\\ 1 & 1 & 1\\ 0& 0& 1 \\\end{bmatrix}A=???010?110?011????
可以得到
[fn+1,fn+2,Sn+1]=[fn,fn+1,Sn][010111001][f_{n+1}, f_{n +2}, S_{n+1}] = [f_n, f_{n +1}, S_n]\begin{bmatrix} 0 & 1 & 0\\ 1 & 1 & 1\\ 0& 0& 1 \\\end{bmatrix}[fn+1?,fn+2?,Sn+1?]=[fn?,fn+1?,Sn?]???010?110?011????
即:Fn+1=FnAF_{n+1} = F_{n}AFn+1?=Fn?A
所以:
Fn=F1An?1F_{n} = F_{1}A^{n-1}Fn?=F1?An?1
時(shí)間復(fù)雜度:快速冪的時(shí)間復(fù)雜度是 O(logn)O(logn)O(logn),所以本算法的時(shí)間復(fù)雜度也是O(logn)O(logn)O(logn)。
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 3; typedef long long LL;int n, m;void mul(int c[], int a[], int b[][N]){int temp[N] = {0};for(int i = 0; i < N; i++)for(int j = 0; j < N; j++)temp[i] = (temp[i] + (LL) a[j] * b[j][i]) % m;memcpy(c, temp, sizeof temp); }void mul(int c[][N], int a[][N], int b[][N]){int temp[N][N] = {0};for(int i = 0; i< N; i ++)for(int j = 0; j<N; j++)for(int k = 0; k<N; k++)temp[i][j] = (temp[i][j] + (LL) a[i][k] * b[k][j] ) % m;memcpy(c, temp, sizeof temp); }int main(){cin >> n >> m;int f1[N] = {1, 1, 1};//f1, f2, s1int a[N][N] = {{0, 1, 0},{1, 1, 1},{0, 0, 1}};// f1 * a^(n-1)n --; // n變成n-1while(n){if( n & 1) mul(f1, f1, a); // f1 = f1 * a;mul(a, a, a); // a = a * a;n >>= 1; // n /= 2;}cout << f1[2] << endl;}題目來源
https://www.acwing.com/problem/content/1305/
總結(jié)
以上是生活随笔為你收集整理的算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法提高课-图论-单源最短路的综合应用-
- 下一篇: 算法提高课-图论-单源最短路的扩展应用-