一、前提
1. 只有方阵可以做矩阵快速幂
- 幂运算 = 矩阵自乘无数次
- 非方阵无法自乘(维度不匹配) 能快速幂的:2*2,3*3... 方阵 ; 不能快速幂的:2*1... 列向量、长方形矩阵
2. 完整解题结构
- 方阵做快速幂(核心计算)
- 最后一步用「方阵 × 列向量」得到答案
- 列向量永远不参与幂运算
二、前置知识:矩阵乘法规则
1. 合法乘法
中间维度必须相等
2. 方阵乘法(矩阵快速幂专用)
完全闭合,可以无限自乘。
3. 单位矩阵(矩阵版的 1)
快速幂初始答案必须是单位矩阵:
性质:任何矩阵 × 单位矩阵 = 原矩阵
三、矩阵快速幂原理
普通快速幂:
矩阵快速幂:
只是把「数字乘法」换成「矩阵乘法」 时间复杂度:,可以处理
四、线性递推 → 转移矩阵
通用二阶递推

五、普通快速幂 & 矩阵快速幂模板
- 多组数据必须每次重建矩阵、全部初始化
cpp
//Math
#include<bits/stdc++.h>
using namespace std;
/*********************************************************** */
//普通快速幂 求a^bMOD M
int qpow(int a,int b,int M){
int res=1LL;
a%=M;
while(b){
if(b&1)res=res*a%M;
b>>=1LL;
a=a*a%M;
}
return res;
}
/*************************************************************** */
//矩阵快速幂
int MOD=1e9+7;
struct Matrix{
int size;
vector< vector<int>>m;
Matrix(int n){
size=n;
m.assign(n,vector<int>(n,0));
}
void make_E(){
for (int i=0; i<size; i++)m[i][i]=1;
}
void Input(){
for(int i=0;i<size;i++)
for(int j=0;j<size;j++)
cin>>m[i][j];
}
void Output(){
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
cout<<m[i][j]<<' ';
}
cout<<endl;
}
}
};
Matrix operator*(const Matrix&A,const Matrix&B){
int len=A.size;
Matrix res(len);
for (int i=0;i<len;i++)
for (int k=0;k<len;k++)
if(A.m[i][k])
for(int j=0;j<len;j++)
res.m[i][j]=(res.m[i][j]+A.m[i][k]*B.m[k][j])%MOD;
return res;
}
//A^k
Matrix mat_qpow(Matrix A,int k){
Matrix res(A.size);
res.make_E();
while(k){
if(k&1)res=res*A;
A=A*A;
k>>=1LL;
}
return res;
}
/******************************************************* */
void solve(){
//斐波那契数列 f(1)=1, f(2)=1, f(n)=f(n-1)+f(n-2)
//求f(n) MOD=1e9+7
int n;cin>>n;
if(n<=2){cout<<(1);return;}
Matrix Q(2);
Q.m[0][0]=Q.m[0][1]=Q.m[1][0]=1;
Q=mat_qpow(Q,n-2);
cout<<(Q.m[0][0]+Q.m[0][1])%MOD;
}
signed main(){
ios_base::sync_with_stdio(false),cin.tie(nullptr);
cout.tie(0);
int _=1;
//cin>>_;
while(_--)solve();
return 0;
}