矩阵
1.基本运算(+, -, *)
struct Matrix {
int n, m;
LL c[Maxn + 5][Maxn + 5];
Matrix () { memset (c, 0, sizeof c); }
void init () {
for (int i = 0; i <= n; i++)
c[i][i] = 1;
}
void cpy (LL a[][Maxn + 5]) {
for (int i = 0; i < Maxn + 5; i++) {
for (int j = 0; j < Maxn + 5; j++) {
c[i][j] = a[i][j];
}
}
}
void read () {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf ("%lld", &c[i][j]);
c[i][j] %= Mod;
if (c[i][j] < 0) c[i][j] += Mod;
}
}
}
void write () {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
printf ("%lld ", c[i][j]);
}
puts ("");
}
}
Matrix operator * (const Matrix x) const {
Matrix ans; ans.n = n; ans.m = x.m;
for (int i = 1; i <= ans.n; i++) {
for (int k = 1; k <= m; k++) {
for (int j = 1; j <= ans.m; j++) {
ans.c[i][j] += c[i][k] * x.c[k][j];
ans.c[i][j] %= Mod;
if (ans.c[i][j] < 0) ans.c[i][j] += Mod;
}
}
}
return ans;
}
Matrix operator + (const Matrix x) const {
Matrix ans; ans.n = n; ans.m = m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
ans.c[i][j] = c[i][j] + x.c[i][j];
}
}
return ans;
}
Matrix operator - (const Matrix x) const {
Matrix ans; ans.n = n; ans.m = m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
ans.c[i][j] = c[i][j] - x.c[i][j];
}
}
return ans;
}
};
2.压行
struct Matrix {int n, m;LL map[Maxn][Maxn];Matrix () { memset (map, 0, sizeof map); }void init () {for (int i = 0; i <= n; i++)map[i][i] = 1;}void cpy (LL a[][Maxn]) {for (int i = 0; i < Maxn; i++) {for (int j = 0; j < Maxn; j++) {map[i][j] = a[i][j];}}}void read () {for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {scanf ("%lld", &map[i][j]);map[i][j] %= mod;if (map[i][j] < 0) map[i][j] += mod;}}}void write () {for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {printf ("%lld ", map[i][j]);}puts ("");}}Matrix operator * (const Matrix x) const {Matrix ans; ans.n = n; ans.m = x.m;for (int i = 1; i <= ans.n; i++) {for (int j = 1; j <= ans.m; j++) {for (int k = 1; k <= m; k++) {ans.map[i][j] += map[i][k] * x.map[k][j];ans.map[i][j] %= mod;if (ans.map[i][j] < 0) ans.map[i][j] += mod; }}}return ans;}Matrix operator + (const Matrix x) const {Matrix ans; ans.n = n; ans.m = m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {ans.map[i][j] = map[i][j] + x.map[i][j];}}return ans;}Matrix operator - (const Matrix x) const {Matrix ans; ans.n = n; ans.m = m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {ans.map[i][j] = map[i][j] + x.map[i][j];}}return ans;}};