包含矩阵加法、减法、乘法、快速幂、流输入、流输出
class mat
{
public:
int n, m;
vector<vector<int> > a;
mat(int n, int m) : n(n), m(m) { a.resize(n + 1, vector<int>(m + 1)); }
mat operator+(const mat &T) const
{
mat res(n, m);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
res.a[i][j] = (a[i][j] + T.a[i][j]) % mod;
return res;
}
mat operator-(const mat &T) const
{
mat res(n, m);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
res.a[i][j] = (a[i][j] - T.a[i][j]) % mod;
return res;
}
mat operator*(const mat &T) const
{
mat res(n, T.m);
int r;
for (int i = 1; i <= n; ++i)
for (int k = 1; k <= m; ++k)
{
r = a[i][k];
for (int j = 1; j <= T.m; ++j)
res.a[i][j] += T.a[k][j] * r, res.a[i][j] %= mod;
}
return res;
}
mat operator^(int x) const
{
mat res(n, n), bas(n, m); // n == m
for (int i = 1; i <= n; ++i)
res.a[i][i] = 1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
bas.a[i][j] = a[i][j] % mod;
while (x)
{
if (x & 1)
res = res * bas;
bas = bas * bas;
x >>= 1;
}
return res;
}
};
istream &operator>>(istream &is, mat &x)
{
for (int i = 1; i <= x.n; ++i)
for (int j = 1; j <= x.m; ++j)
is >> x.a[i][j];
return is;
}
ostream &operator<<(ostream &os, const mat &x)
{
for (int i = 1; i <= x.n; ++i)
{
for (int j = 1; j <= x.m; ++j)
os << x.a[i][j] << " ";
os << endl;
}
return os;
}

