题目描述
给定n*n的矩阵A,求A^k
分析
矩阵之间的乘法遵循以下的原则:
\[c_{ij}=\sum^n_{k=1}a_{i,k}\times b_{k,j}\]
在矩阵中,单位矩阵也就是代表着数值1的矩阵是从左上到右下的对角线是1,其余都是0的矩阵。
不知为什么本地dev ide过不了,到洛谷ide就过掉了,可能是我c++太弱了。
如果实在记不住乘法的原则,那么叫你们一个办法,可以把它看成floyd。
蒟蒻我一开始不懂得时候也是把它看成弗洛伊德背的。
代码
#include <bits/stdc++.h>
#define ll long long
#define mod 1000000007
#define N 1005
using namespace std;
template <typename T>
inline void read(T &x) {
x = 0; T fl = 1;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-') fl = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= fl;
}
struct Matrix {
ll a[N][N], n;
Matrix() {
memset(a, 0, sizeof(a));
}
void init(int nn) {
n = nn;
}
void build() {
for (int i = 1; i <= n; i ++)
a[i][i] = 1;
}
void write() {
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++)
printf("%lld ", a[i][j] % mod);
puts("");
}
}
}a, ans, e;
int n;
ll k;
Matrix operator *(const Matrix &a, const Matrix &b) {
Matrix c;
c.init(n);
for (int k = 1; k <= n; k ++)
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
c.a[i][j] = (c.a[i][j] + a.a[i][k] * b.a[k][j] % mod) % mod;
return c;
}
Matrix operator ^(Matrix x, ll k) {
Matrix res;
res.init(n);
res.build();
for (; k; k >>= 1) {
if (k & 1) res = res * x;
x = x * x;
}
return res;
}
int main() {
read(n); read(k);
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
read(a.a[i][j]);
a.init(n);
ans = a ^ k;
ans.write();
return 0;
}