概念:
前置知识:
普通快速幂:[YM]模板-快速幂-CSDN博客
矩阵加减法:
一个m行n列的矩阵用二维数组matrix[ ][ ]存储
(1)矩阵的加减法:
两个矩阵对应位置的元素加减即可
矩阵乘法:
(2)矩阵的乘法:
1)一个数k乘矩阵A,把k乘以矩阵的每一个元素,记为kA
2)两个矩阵A和B相乘,要求A的列数等于B的行数,设A的尺寸为m*n
,B的尺寸为n*u,那么乘积C=A*B的尺寸为m*u。
复杂度:O(m*n*u)
矩阵快速幂:
快速幂都是行列相同的矩阵
单位矩阵相当于一开始的res=1的“1”
模板:
struct Matrix{
int M;
vector<vector<ll>>m;
Matrix(){}
Matrix(int n){
M=n;
m.resize(n+1,vector<ll>(n+1,0));
}
void init(){
for(int i=1;i<=M;i++)m[i][i]=1;
}
Matrix operator*(const Matrix &B)const{
Matrix ans(M);
for(int i=1;i<=M;i++)
for(int j=1;j<=M;j++)
for(int k=1;k<=M;k++)
ans.m[i][j]=(ans.m[i][j]+m[i][k]*B.m[k][j]%mod)%mod;
return ans;
}
Matrix operator*(ll n)const{
Matrix ans(M),a=*this;
ans.init();
while(n){
if(n&1)ans=ans*a;
a=a*a;
n>>=1;
}
return ans;
}
void show(){
for(int i=1;i<=M;i++)
for(int j=1;j<=M;j++)
cout<<m[i][j]<<" \n"[j==M];
}
};
例题:
P3390 【模板】矩阵快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
代码:
/*---code---*/
struct Matrix{
int M;
vector<vector<ll>>m;
Matrix(){}
Matrix(int n){
M=n;
m.resize(n+1,vector<ll>(n+1,0));
}
void init(){
for(int i=1;i<=M;i++)m[i][i]=1;
}
Matrix operator*(const Matrix &B)const{
Matrix ans(M);
for(int i=1;i<=M;i++)
for(int j=1;j<=M;j++)
for(int k=1;k<=M;k++)
ans.m[i][j]=(ans.m[i][j]+m[i][k]*B.m[k][j]%mod)%mod;
return ans;
}
Matrix operator*(ll n)const{
Matrix ans(M),a=*this;
ans.init();
while(n){
if(n&1)ans=ans*a;
a=a*a;
n>>=1;
}
return ans;
}
void show(){
for(int i=1;i<=M;i++)
for(int j=1;j<=M;j++)
cout<<m[i][j]<<" \n"[j==M];
}
};
int n;
ll k;
void solve(){
cin>>n>>k;
Matrix a(n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a.m[i][j];
(a*k).show();
}