矩阵

矩阵

//从a[1][1]存到a[n][n],n等于矩阵的长宽
struct Matrix {
    ll mat[N][N];
    Matrix operator * (const Matrix& b)const {
        Matrix ans;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                ans.mat[i][j] = 0;
                for (int k = 1; k <= n; k++) {
                    if (mat[i][k] && b.mat[k][j]) {
                        ans.mat[i][j] += mat[i][k] * b.mat[k][j];
                        ans.mat[i][j] %= mod;
                    }
                }
            }
        }
        return ans;
    }
};

Matrix q_pow(Matrix a, int b) {
    Matrix ans;
    memset(ans.mat, 0, sizeof(ans));
    for (int i = 1; i <= n; i++) {
        ans.mat[i][i] = 1;
    }
    while (b) {
        if (b & 1)
            ans = ans * a;
        b >>= 1;
        a = a * a;
    }
    return ans;
}
//龟速乘
ll Wuguidechengfa(ll x, ll y)
{
    ll ans = 0;
    while (y)
    {
        if (y & 1) (ans += x) %= mod;
        (x += x) %= mod;
        y >>= 1;
    }
    return ans;
}

//封装

struct matrix {
    vector<vector<ll>> a;
    matrix(ll n, ll m, ll init) : a(vector<vector<ll>>(n, vector<ll>(m, init))) {}  // n rows, m columns
    matrix(ll n, ll m) : matrix(n, m, 0) {}
    matrix(ll n) : matrix(n, n) {}
    matrix() = default;
    matrix(const vector<vector<ll>>& a) : a(a) {}
    vector<ll>& operator[](ll n) { return a[n]; }
    const vector<ll>& operator[](ll n) const { return a[n]; }
    ll sum() const {
        ll ret = 0;
        for (auto& p : a)
            for (ll i : p) ret = (ret + i) % mod;
        return ret;
    }
    matrix operator+(const matrix& b) const {
        ll n, m;
        matrix ret(n = a.size(), m = a[0].size());
        for (ll i = 0; i < n; i++) {
            for (ll j = 0; j < m; j++) {
                ret[i][j] = (a[i][j] + b[i][j]) % mod;
            }
        }
        return move(ret);
    }
    matrix operator-(const matrix& b) const {
        ll n, m;
        matrix ret(n = a.size(), m = a[0].size());
        for (ll i = 0; i < n; i++) {
            for (ll j = 0; j < m; j++) {
                ret[i][j] = ((a[i][j] - b[i][j]) % mod + mod) % mod;
            }
        }
        return move(ret);
    }
    matrix operator*(const matrix& b) const {
        ll n = a.size(), m = a[0].size(), o = b[0].size();
        matrix ret(n, o);
        for (ll i = 0; i < n; i++) {
            for (ll j = 0; j < o; j++) {
                for (ll k = 0; k < m; k++) {
                    ret[i][j] = (ret[i][j] + a[i][k] * b[k][j] % mod) % mod;
                }
            }
        }
        return move(ret);
    }
    static matrix E(ll n) {
        matrix ret(n, n);
        for (ll i = 0; i < n; i++) ret[i][i] = 1;
        return move(ret);
    }
    void print() const {
        for (auto& p : a) {
            for (ll i : p) cerr << i << " ";
            cerr << endl;
        }
    }
};
matrix qpow(matrix a, ll b) {
    matrix c = matrix::E(a[0].size());
    for (; b; b >>= 1, a = a * a) {
        if (b & 1) c = c * a;
    }
    return (c);
}

Last updated