矩阵快速幂

矩阵快速幂

1、模版题:洛谷P3390

template<typename T>
struct mat{
    static const int MAX = 105;
    T m[MAX][MAX];

    mat() {
        memset(m, 0, sizeof m);
    }

    inline void init() {
		//构造单位矩阵
		//单位矩阵,它从左上角到右下角的对角线上的元素均为1,除此以外全都为0。
		//它在矩阵乘中相当于数乘中的1,即任何矩阵乘它都等于本身。
        for (int i = 0; i < MAX; i++) {
            m[i][i] = 1;
        }
    }

    inline mat operator+ (mat &B) const {
        mat<T> res;
        for (int i = 0; i < MAX; i++) {
            for (int j = 0; j < MAX; j++) {
                res.m[i][j] = (m[i][j] + B.m[i][j]) % mod;
                res.m[i][j] = (res.m[i][j] + mod) % mod;
            }
        }
        return res;
    }

    inline mat operator- (mat &B) const {
        mat<T> res;
        for (int i = 0; i < MAX; i++) {
            for (int j = 0; j < MAX; j++) {
                res.m[i][j] = (m[i][j] - B.m[i][j]) % mod;
                res.m[i][j] = (res.m[i][j] + mod) % mod;
            }
        }
        return res;
    }

    inline mat operator* (mat &B) const {
        mat<T> res;
        for (int i = 0; i < MAX; i++) {
            for (int j = 0; j < MAX; j++) {
                for (int k = 0; k < MAX; k++) {
                    res.m[i][j] = (res.m[i][j] + m[i][k] * B.m[k][j]) % mod;
                    res.m[i][j] = (res.m[i][j] + mod) % mod;
                }
            }
        }
        return res;
    }

    inline mat operator^ (T b) const {
        mat<T> res, A = *(this);
        res.init();
        while (b) {
            if (b & 1) res = res * A;
            A = A * A;
            b >>= 1;
        }
        return res;
    }
};
posted @ 2024-09-03 10:44  grape_king  阅读(13)  评论(0)    收藏  举报