矩阵模板
struct mat{
int m[N][N];
//将A.m[i][j] 改成 A[i][j] 这种格式
int* operator [] (size_t i) {return m[i];}
const int* operator [] (size_t i) const {return m[i];}
mat() {memset(m,0,sizeof m);}//初始化矩阵
mat operator * (const mat& b) const {//矩阵乘法
mat res;
for(int i=0;i<N;i++)
for(int k=0;k<N;k++){
if(!m[i][k]) continue;
const int a=m[i][k];
for(int j=0;j<N;j++) res[i][j]=res[i][j]+a*b[k][j];
}
return res;
}
mat operator + (const mat& b) const {//矩阵加法
mat res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res[i][j]=m[i][j]+b[i][j];
return res;
}
mat operator ^ (int b) const {//矩阵快速幂
mat a=(*this);
mat res; res.init();
while(b){
if(b&1) res=res*a;
a=a*a;
b>>=1;
}
return res;
}
mat T(){//矩阵转置
mat res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res[i][j]=m[j][i];
return res;
}
void init(){//单位矩阵
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if(i==j) m[i][j]=1;
else m[i][j]=0;
}
void write(){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++) cout<<m[i][j]<<" ";
cout<<"\n";
}
}
};
本文来自博客园,作者:_AzureSky,转载请注明原文链接:https://www.cnblogs.com/-AzureSky-/p/19098359

浙公网安备 33010602011771号