【数学】矩阵

struct Matrix {

    static const int MOD = 1e9 + 7;
    static const int MAXK = 400 + 10;

    int k, A[MAXK][MAXK];

    void Init(int k) {
        this->k = k;
        memset(A, 0, sizeof(A));
    }

    Matrix operator+(const Matrix &ma)const {
        Matrix res;
        res.Init(k);
        for(int i = 1; i <= k; ++i) {
            for(int j = 1; j <= k; ++j) {
                res.A[i][j] = A[i][j] + ma.A[i][j];
                if(res.A[i][j] >= MOD)
                    res.A[i][j] -= MOD;
            }
        }
        return res;
    }

    Matrix operator-(const Matrix &ma)const {
        Matrix res;
        res.Init(k);
        for(int i = 1; i <= k; ++i) {
            for(int j = 1; j <= k; ++j) {
                res.A[i][j] = A[i][j] - ma.A[i][j];
                if(res.A[i][j] < 0)
                    res.A[i][j] += MOD;
            }
        }
        return res;
    }

    Matrix operator*(const Matrix &ma)const {
        Matrix res;
        res.Init(k);
        for(int i = 1; i <= k; ++i) {
            for(int t = 1; t <= k; ++t) {
                for(int j = 1, T = A[i][t]; j <= k; ++j) {
                    res.A[i][j] += 1LL * T * ma.A[t][j] % MOD;
                    if(res.A[i][j] >= MOD)
                        res.A[i][j] -= MOD;
                }
            }
        }
        return res;
    }

    Matrix pow(ll n)const {
        Matrix res, x;
        res.Init(k), x.Init(k);
        for(int i = 1; i <= k; ++i) {
            res.A[i][i] = 1;
            for(int j = 1; j <= k; ++j)
                x.A[i][j] = A[i][j];
        }
        while(n) {
            if(n & 1)
                res = res * x;
            x = x * x;
            n >>= 1;
        }
        return res;
    }

    void Show() {
        for(int i = 1; i <= k; ++i) {
            for(int j = 1; j <= k; ++j)
                printf("%d%c", A[i][j], " 
"[j == k]);
        }
    }

};

MAXK=400可以放进Windows的栈中,MAXK更大的话,就要写成静态的形式了,否则可能会出现RE的情况。

矩阵快速幂:https://www.luogu.com.cn/problem/P3390

原文地址:https://www.cnblogs.com/purinliang/p/14332781.html