矩阵模板

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";
        }
    }
};
posted @ 2025-09-18 11:06  _AzureSky  阅读(6)  评论(0)    收藏  举报