线性代数学习指南

前置芝士

矩阵乘法

时间复杂度:\(O(n^3)\)

const int mod=1e9+7;
struct matrix{
	ll c[110][110];
	matrix(){memset(c,0,sizeof(c));}
}A,res;
matrix operator*(matrix &x,matrix &y){
	matrix t;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
				t.c[i][j]=(t.c[i][j]+x.c[i][k]*y.c[k][j])%mod;
			//常数优化:调换j,k的循环次序,提高空间访问效率
}

单位矩阵

\(I = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix}\)

矩阵快速幂

[problem description]

给定n×n 的矩阵A,求 \(A^k\)

[input]

第一行两个整数n,k
接下来n 行,每行n 个整数,第 i 行的第 j 的数表示Ai,j

[output]

输出\(A^k\)

n 行,每行 n 个数,第 i 行第 j 个数表示 \((A^k)_{i,j}\),每个元素对 \(10^9+7\)取模。

\(1\le n \le 100\)\(0 \le k \le 10^{12}\)\(|A_{i,j}| \le 1000\)

[solved]

const int mod=1e9+7;
struct matrix{
	ll c[110][110];
	matrix(){memset(c,0,sizeof(c));}
}A,res;
ll n,k;

matrix operator*(matrix &x,matrix &y){
	matrix t;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
				t.c[i][j]=(t.c[i][j]+x.c[i][k]*y.c[k][j])%mod;
			//常数优化:调换j,k的循环次序,提高空间访问效率
	return t;
}
void qmi(ll k){
	for(int i=1;i<=n;i++) res.c[i][i]=1;
	while(k){
		if(k&1) res=res*A;
		A=A*A;
		k>>=1;
	}
}
void solve() {
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++) cin>>A.c[i][j];
	qmi(k);
	for(int i=1;i<=n;i++){
		{for(int j=1;j<=n;j++) cout<<res.c[i][j]<<" ";}
		cout<<endl;
	}
}
posted @ 2023-10-22 08:42  White_Sheep  阅读(3)  评论(0编辑  收藏  举报