ZTL — 数学 — 矩阵

· · 个人记录

V1.0 矩阵限长宽相等,加减乘限长宽相等

const matrix_maxn = maxn;
struct matrix{
    long long a[matrix_maxn][matrix_maxn];
    matrix(){ //初始化 
        memset(a,0,sizeof(a));
    }
    inline void init(){//单位矩阵 
        for(int i = 1; i <= n; ++i) a[i][i] = 1;
    }
};

//矩阵加
matrix operator +(const matrix &x, const matrix &y){
    matrix ans_;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            ans_.a[i][j] = (x.a[i][j] + y.a[i][j]);
    return ans_;
}
//矩阵减
matrix operator -(const matrix &x, const matrix &y){
    matrix ans_;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            ans_.a[i][j] = (x.a[i][j] - y.a[i][j]);
    return ans_;
}
//矩阵乘矩阵
matrix operator *(const matrix &x, const matrix &y){
    matrix ans_;
    for(int k = 1; k <= n; ++k)
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= n; ++j)
                ans_.a[i][j] = (ans_.a[i][j] + x.a[i][k] * y.a[k][j]);
    return ans_;
}
//矩阵快速幂
matrix mat_pow(matrix a, ll k){
    matrix ans_; ans_.init();
    while(k){
        if(k&1) ans_ = ans_ * a;
        a = a*a; k >>= 1;
    }
    return ans_;
}