矩阵乘法 模板

矩阵乘法(英语:matrix multiplication)是一种根据两个矩阵得到第三个矩阵的二元运算,第三个矩阵即前两者的乘积,称为矩阵积。
它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。
矩阵乘法满足结合律,不满足交换律;

在这里插入图片描述
一般采用结构体存储矩阵

const int N=4;
struct matrix
{
	int n,m;
	LL g[N][N];
	void set(int x) //建立x*x的单位矩阵 
	{
		n=m=x;
		for(int i=1;i<=x;i++) 
			for(int j=1;j<=x;j++) 
				g[i][j]=(i==j);
		return;
	}
	void clear() //矩阵初始化 
	{
		n=m=0;
		memset(g,0,sizeof(g));
		return;	
	} 
};

矩阵乘法

const LL MOD=1e9+7;
matrix operator*(matrix x,matrix y) //重载运算符
{
	matrix z;
	z.clear();
	z.n=x.n; z.m=y.m;
	for(int i=1;i<=z.n;i++) {
		for(int j=1;j<=z.m;j++) {
			LL ans=0;
			for(int k=1;k<=x.m;k++) 
				ans+=(LL)x.g[i][k]*y.g[k][j]%MOD;
			z.g[i][j]=ans%MOD;
		}
	}
	return z;
}

矩阵快速幂

matrix operator^(matrix x,LL k) //需要矩阵乘法
{
	matrix res;
	res.set(3); 
	while(k) {
		if(k&1) res=res*x;
		x=x*x; k>>=1;
	}
	return res;
}

输出矩阵

void matrix_put(matrix a)
{
	for(int i=1;i<=a.n;i++) {
		for(int j=1;j<=a.m;j++) {
			printf("%lld ",a.g[i][j]%MOD);
		}
		puts("");
	}
	return;
}
发布了4 篇原创文章 · 获赞 0 · 访问量 103

猜你喜欢

转载自blog.csdn.net/qq_45646484/article/details/104082610