ACM / 数学 / 线性代数 · 2024-03-29

矩阵操作运算

包含矩阵加法、减法、乘法、快速幂、流输入、流输出

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;
}