线性代数学习指南
前置芝士
矩阵乘法
时间复杂度:\(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;
}
}