數學知識——矩陣乘法

使用矩陣快速冪優化遞推問題

對于一個遞推問題,如遞推式的每一項系數都為常數,我們可以使用矩陣快速冪來對算法進行優化。
一般形式為:
F n = F 1 × A n ? 1 F_n=F_1×A^{n-1} Fn?=F1?×An?1
由于遞推式的每一項系數都為常數,因此對于每一步的遞推, A A A里面都是相同的常數。
對于 A n ? 1 A^{n-1} An?1部分使用快速冪求解,根據 F n F_n Fn?就能得到最終答案。

矩陣快速冪:

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) % m;memcpy(c, temp, sizeof temp);
}
while (k){if (k & 1) mul(f, f, a);mul(a, a, a);k >>= 1;}

斐波那契數列的前n項和

大家都知道 Fibonacci 數列吧, f 1 = 1 , f 2 = 1 , f 3 = 2 , f 4 = 3 , … , f n = f n ? 1 + f n ? 2 f_1=1,f_2=1,f_3=2,f_4=3,…,f_n=f_{n?1}+f_{n?2} f1?=1,f2?=1,f3?=2,f4?=3,,fn?=fn?1?+fn?2?
現在問題很簡單,輸入 n n n m m m,求 f n f_n fn?的前 n n n 項和 S n ( m o d m ) S_n(mod\ m) Sn?(mod?m)

輸入格式

共一行,包含兩個整數 n n n m m m

輸出格式

輸出前 n n n 項和 S n ( m o d m ) S_n (mod\ m) Sn?(mod?m) 的值。

數據范圍
1 ≤ n ≤ 2000000000 , 1≤n≤2000000000, 1n2000000000,
1 ≤ m ≤ 1000000010 1≤m≤1000000010 1m1000000010

輸入樣例:

5 1000

輸出樣例:

12

我們有遞推關系:
f n = f n ? 1 + f n ? 2 f_n=f_{n-1}+f_{n-2} fn?=fn?1?+fn?2?
S n = S n ? 1 + f n S_n=S_{n-1}+f_n Sn?=Sn?1?+fn?
F n = [ f n , f n + 1 , S n ] F_n=[f_n,f_{n+1},S_n] Fn?=[fn?,fn+1?,Sn?],有 F n × A = F n + 1 F_n×A=F_{n+1} Fn?×A=Fn+1?,根據遞推關系求解矩陣 A A A
[ f n , f n + 1 , S n ] × [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] = [ f n + 1 , f n + 2 , S n + 1 ] [f_n,f_{n+1},S_n]× \begin{bmatrix} a_{11} & a_{12}& a_{13}\\ a_{21}& a_{22}& a_{23}\\ a_{31} & a_{32} & a_{33} \end{bmatrix}=[f_{n+1},f_{n+2},S_{n+1}] [fn?,fn+1?,Sn?]× ?a11?a21?a31??a12?a22?a32??a13?a23?a33?? ?=[fn+1?,fn+2?,Sn+1?]

求解得到 A = [ 0 1 0 1 1 1 0 0 1 ] A = \begin{bmatrix} 0 & 1 & 0 \\ 1 & 1 & 1 \\ 0 & 0 & 1 \end{bmatrix} A= ?010?110?011? ?

F 1 = [ 1 , 1 , 1 ] F_1=[1,1,1] F1?=[1,1,1],最終答案為 F 1 × A n ? 1 F_1×A^{n-1} F1?×An?1,對于 A n ? 1 A^{n-1} An?1部分采用快速冪來計算,時間復雜度為 O ( l o g n ? 3 3 ) O(logn*3^3) O(logn?33)

佳佳的斐波那契

佳佳對數學,尤其對數列十分感興趣。

在研究完 Fibonacci 數列后,他創造出許多稀奇古怪的數列。

例如用 S ( n ) S(n) S(n) 表示 Fibonacci 前 n n n 項和 m o d m mod\ m mod?m 的值,即 S ( n ) = ( F 1 + F 2 + … + F n ) m o d m S(n)=(F_1+F_2+…+F_n)mod\ m S(n)=(F1?+F2?++Fn?)mod?m,其中 F 1 = F 2 = 1 , F i = F i ? 1 + F i ? 2 F_1=F_2=1,F_i=F_{i?1}+F_{i?2} F1?=F2?=1,Fi?=Fi?1?+Fi?2?

可這對佳佳來說還是小菜一碟。

終于,她找到了一個自己解決不了的問題。

T ( n ) = ( F 1 + 2 F 2 + 3 F 3 + … + n F n ) m o d m T(n)=(F_1+2F_2+3F_3+…+nF_n)mod\ m T(n)=(F1?+2F2?+3F3?++nFn?)mod?m 表示 Fibonacci 數列前 n n n 項變形后的和 m o d m mod\ m mod?m 的值。

現在佳佳告訴你了一個 n n n m m m,請求出 T ( n ) T(n) T(n)的值。

輸入格式

共一行,包含兩個整數 n n n m m m

輸出格式

共一行,輸出 T ( n ) T(n) T(n) 的值。

數據范圍
1 ≤ n , m ≤ 2 31 ? 1 1≤n,m≤2^{31?1} 1n,m231?1

輸入樣例:

5 5

輸出樣例:

1

樣例解釋
T ( 5 ) = ( 1 + 2 × 1 + 3 × 2 + 4 × 3 + 5 × 5 ) m o d 5 = 1 T(5)=(1+2×1+3×2+4×3+5×5)mod\ 5=1 T(5)=(1+2×1+3×2+4×3+5×5)mod?5=1

我們有遞推關系:
f n = f n ? 1 + f n ? 2 f_n=f_{n-1}+f_{n-2} fn?=fn?1?+fn?2?
S n = S n ? 1 + f n S_n=S_{n-1}+f_n Sn?=Sn?1?+fn?
T n = T n ? 1 + n ? f n T_n=T_{n-1}+n*f_n Tn?=Tn?1?+n?fn?
但是對于 T n = T n ? 1 + n ? f n T_n=T_{n-1}+n*f_n Tn?=Tn?1?+n?fn? f n f_n fn?的系數不為常數,所以無所用矩陣快速冪來優化。

P n = n S n ? T n P_n=nS_n-T_n Pn?=nSn??Tn?,那么有:
P n = ( n ? 1 ) S 1 + ( n ? 2 ) S 2 . . . + S n ? 1 P_n=(n-1)S_1+(n-2)S_2...+S_{n-1} Pn?=(n?1)S1?+(n?2)S2?...+Sn?1?,
P n + 1 = n S 1 + ( n ? 1 ) S 2 . . . + 2 S n ? 1 + S n P_{n+1}=nS_1+(n-1)S_2...+2S_{n-1}+S_{n} Pn+1?=nS1?+(n?1)S2?...+2Sn?1?+Sn?,
P n + 1 ? P n = S n P_{n+1}-P_n=S_n Pn+1??Pn?=Sn?
于是,我們有以下三組遞推關系:
f n = f n ? 1 + f n ? 2 f_n=f_{n-1}+f_{n-2} fn?=fn?1?+fn?2?
S n = S n ? 1 + f n S_n=S_{n-1}+f_n Sn?=Sn?1?+fn?
P n = P n ? 1 + S n ? 1 P_n=P_{n-1}+S_{n-1} Pn?=Pn?1?+Sn?1?
每一組的系數都為常數,我們可以使用矩陣快速冪來優化。
F n = [ f n , f n + 1 , S n , P n ] F_n=[f_n,f_{n+1},S_n,P_n] Fn?=[fn?,fn+1?,Sn?,Pn?],有 F n × A = F n + 1 F_n×A=F_{n+1} Fn?×A=Fn+1?,根據遞推關系求解矩陣 A A A
[ f n , f n + 1 , S n , P n ] × [ a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 ] = [ f n + 1 , f n + 2 , S n + 1 , P n + 1 ] [f_n,f_{n+1},S_n,P_n]× \begin{bmatrix} a_{11} & a_{12}& a_{13}& a_{14}\\ a_{21}& a_{22}& a_{23}& a_{24}\\ a_{31} & a_{32} & a_{33}& a_{34}\\ a_{41} & a_{42} & a_{43}& a_{44}\\ \end{bmatrix}=[f_{n+1},f_{n+2},S_{n+1},P_{n+1}] [fn?,fn+1?,Sn?,Pn?]× ?a11?a21?a31?a41??a12?a22?a32?a42??a13?a23?a33?a43??a14?a24?a34?a44?? ?=[fn+1?,fn+2?,Sn+1?,Pn+1?]
根據遞推關系,解出
A = [ 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 ] A = \begin{bmatrix} 0 & 1 & 0 & 0\\ 1 & 1 & 1 & 0\\ 0 & 0 & 1 & 1\\ 0 & 0 & 0 & 1 \end{bmatrix} A= ?0100?1100?0110?0011? ?
F 1 = [ 1 , 1 , 1 , 0 ] , F_1=[1,1,1,0], F1?=[1,1,1,0], F n = F 1 × A n ? 1 F_n=F_1×A^{n-1} Fn?=F1?×An?1
解出來 S n S_n Sn? P n P_n Pn?,最終答案 T n = n S n ? P n T_n=nS_n-P_n Tn?=nSn??Pn?
時間復雜度為 O ( l o g n ? 4 3 ) O(logn*4^3) O(logn?43)

#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 4;
int n, m;
void mul(int a[][N], int b[][N], int c[][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)b[i][k] * c[k][j] % m) % m;memcpy(a, temp, sizeof temp);
}
int main()
{cin >> n >> m;int f[N][N] = {1, 1, 1, 0};int a[N][N] = {{0, 1, 0, 0},{1, 1, 1, 0},{0, 0, 1, 1},{0, 0, 0, 1}};int k = n - 1;while (k){if (k & 1) mul(f, f, a);mul(a, a, a);k >>= 1;}cout << ((ll)n * f[0][2]% m - f[0][3] + m) % m << endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75127.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GitHub 趨勢日報 (2025年04月07日)

GitHub 趨勢日報 (2025年04月07日) 本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星語言1microsoft/markitdownPython tool for converting files and office documents to Markdown.? 1039P…

ROS多設備交互

ROS多設備連接同一個Master&#xff1a;ROS Master多設備連接-CSDN博客 在多個PC端連接同一個ROS Master后&#xff0c;接下來就可以實現不同設備之間的話題交流&#xff0c;Master主機端啟動不同PC端的功能包等功能了 盡管多個PC端擁有不同的ROS工作空間&#xff0c;但是只要…

基于國內環境 在Ubuntu 上安裝 Docker 指南

前言 在容器化技術主導云原生時代的今天&#xff0c;Docker 憑借其輕量化、高移植性和秒級部署能力&#xff0c;已成為開發與運維的必備工具。然而&#xff0c;國內用戶在 Ubuntu 系統上安裝 Docker 時&#xff0c;常因 ?官方鏡像源訪問受限、網絡延遲高、依賴包安裝失敗 等問…

數據結構:二叉樹(三)·(重點)

二叉樹的存儲結構 ?叉樹?般可以使?兩種結構存儲&#xff0c;?種順序結構&#xff0c;?種鏈式結構。 順序結構 順序結構存儲就是使?數組來存儲&#xff0c;?般使?數組只適合表?完全?叉樹&#xff0c;因為不是完全?叉樹會有 空間的浪費&#xff0c;完全?叉樹更適合…

EasyExcel實現圖片導出功能(記錄)

背景&#xff1a;在舊系統的基礎上&#xff0c;導出一些工單信息時&#xff0c;現需要新添加處理人的簽名或者簽章&#xff0c;這就涉及圖片的上傳、下載、寫入等幾個操作。 1、EasyExcel工具類 &#xff08;1&#xff09;支持下拉框的導出。 import com.alibaba.excel.Easy…

Android Material Design 3 主題配色終極指南:XML 與 Compose 全解析

最小必要顏色配置 <!-- res/values/themes.xml --> <style name"Theme.MyApp" parent"Theme.Material3.DayNight"><!-- 基礎三原色 --><item name"colorPrimary">color/purple_500</item><item name"col…

【Git】“warning: LF will be replaced by CRLF”的解決辦法

一、原因分析 不同操作系統的換行符標準不同&#xff1a; ? Windows&#xff1a;使用 CRLF&#xff08;\r\n&#xff09;表示換行&#xff1b; ? Linux/Mac&#xff1a;使用 LF&#xff08;\n&#xff09;表示換行 Git 檢測到本地文件的換行符與倉庫設置或目標平臺不兼容時…

PyTorch 深度學習實戰(33):聯邦學習與隱私保護

在上一篇文章中,我們探討了多模態學習與CLIP模型的應用。本文將深入介紹聯邦學習(Federated Learning)這一新興的分布式機器學習范式,它能夠在保護數據隱私的前提下實現多方協作的模型訓練。我們將使用PyTorch實現一個基礎的聯邦學習框架,并在圖像分類任務上進行驗證。 一…

藍橋杯 web 展開你的扇子(css3)

普通答案&#xff1a; #box:hover #item1{transform: rotate(-60deg); } #box:hover #item2{transform: rotate(-50deg); } #box:hover #item3{transform: rotate(-40deg); } #box:hover #item4{transform: rotate(-30deg); } #box:hover #item5{transform: rotate(-20deg); }…

LLM驅動的智能體:基于GPT的對話智能體開發指南

前言 大語言模型&#xff08;LLM, Large Language Model&#xff09;正在徹底改變智能體&#xff08;Agent&#xff09;的設計和實現方式。從簡單的聊天機器人到復雜的自動化助手&#xff0c;基于GPT等LLM的對話智能體已經在客服、教育、辦公自動化、編程助手等領域得到了廣泛…

深度解析 C# 中介者模式:設計與實戰應用

中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是將多個對象之間的交互集中到一個中介者對象中&#xff0c;從而減少對象之間的直接交互&#xff0c;降低耦合度。在實現復雜系統時&#xff0c;中介者模式有助于提高系統的可維…

每日算法-250408

記錄今天解決的兩道 LeetCode 算法題&#xff0c;主要涉及二分查找的應用。 1283. 使結果不超過閾值的最小除數 題目描述 思路 核心思路是 二分查找。 解題過程 為什么可以使用二分&#xff1f; 關鍵在于單調性。對于一個固定的數組 nums&#xff0c;當除數 divisor 增大時&…

MySQL的子查詢

一、前言 MySQL 子查詢是指嵌套在其他 SQL 語句&#xff08;如 SELECT、WHERE、FROM 等&#xff09;內部的查詢。用于輔助主查詢完成復雜的數據篩選或計算。 二、子查詢分類 標量子查詢 描述&#xff1a;返回 單行單列&#xff08;一個值&#xff09;&#xff0c;常用于比較運…

Linux 基礎入門操作 前言 VIM的基本操作 2

1 VIM的背景介紹 Vi 的誕生與1976年&#xff0c;Vim 的前身是 Vi&#xff08;Visual Editor&#xff09;&#xff0c;由 Bill Joy 在 BSD Unix 系統上開發&#xff0c;作為 ed&#xff08;行編輯器&#xff09;的改進版本&#xff0c;提供全屏編輯功能&#xff0c;成為 Unix/L…

Java:Set操作

目錄 Set 轉 List Set 轉 List Set<String>set new HashSet<String>(); set.add("c"); set.add("d"); set.add("a"); set.add("a");//方法一&#xff1a; List<String>list new ArrayList<String>(set);//…

算力驅動未來:從邊緣計算到高階AI的算力革命

算力驅動未來&#xff1a;從邊緣計算到高階AI的算力革命 摘要 本文深入探討了不同算力水平&#xff08;20TOPS至160TOPS&#xff09;在人工智能領域的多樣化應用場景。從邊緣計算的實時目標檢測到自動駕駛的多傳感器融合&#xff0c;從自然語言處理的大模型應用到AI for Scie…

虛擬機上安裝openEuler和openGauss數據庫

1.虛擬機版本選擇VM 16 PRO 2.openEuler版本選擇openEuler-22.03-LTS-SP4-x86_64 下載地址&#xff1a;https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP4/ISO/x86_64/openEuler-22.03-LTS-SP4-x86_64-dvd.iso 3.虛擬機安裝openEuler過程&#xff1a; 4.安裝ope…

0_Pytorch中的張量操作

[引言]張量的概念 1.基本概念 張量是一個通用的多維數組&#xff0c;可以表示標量&#xff08;0 維&#xff09;、向量&#xff08;1 維&#xff09;、矩陣&#xff08;2 維&#xff09;以及更高維度的數據。張量是 PyTorch 中的核心數據結構&#xff0c;用于表示和操作數據。…

LS-LINUX-002 簡易創建SSH

LS-LINUX-002 簡易創建SSH 1. CentOS 8 創建和配置SSH服務 1.1 安裝SSH服務 CentOS 8 默認已經安裝了OpenSSH服務。如果沒有安裝&#xff0c;可以使用以下命令安裝&#xff1a; sudo dnf install -y openssh-server1.2 啟動SSH服務 安裝完成后&#xff0c;需要啟動SSH服務…

計算機專業求職面試的常見題目分類整理

以下是計算機專業求職面試的常見題目分類整理&#xff0c;每個大類精選20道高頻問題&#xff0c;結合參考內容進行解析與擴展&#xff0c;幫助系統化備考&#xff1a; 一、數據結構與算法 解釋時間復雜度和空間復雜度 時間復雜度衡量算法執行時間隨輸入規模的增長趨勢&#xf…