日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数

發布時間:2025/4/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目分析


來源:acwing
分析:

先利用矩陣運算的性質將通項公式變成冪次形式,然后用快速冪的方法求解第 n項。

斐波那契數列的遞推公式: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?(n3)

定義向量 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? 分別表示斐波那契數列的第n項和第n+1項,而且SnS_nSn?表示斐波那契數列的前n項和。則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]

我們要找到遞推關系式,即找到 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?]的關系

我們找到矩陣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

時間復雜度:快速冪的時間復雜度是 O(logn)O(logn)O(logn),所以本算法的時間復雜度也是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/

總結

以上是生活随笔為你收集整理的算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。