zoukankan      html  css  js  c++  java
  • 【数学】矩阵

    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

  • 相关阅读:
    nodejs安装以及配置
    java第三周学习总结
    java第二周学习总结
    java第一周学习总结
    调查问卷
    2016.2.19 学习总结
    第一周学习总结
    第一周学习总结
    假期马原学习计划
    20145335郝昊《java程序设计》第2次实验报告
  • 原文地址:https://www.cnblogs.com/purinliang/p/14332781.html
Copyright © 2011-2022 走看看