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

  • 相关阅读:
    js 控制页面跳转的5种方法
    弹性盒
    js中变量声明有var和没有var的区别
    解决Cannot read property 'style' of null中样式问题
    JS中用for循环解决重复定义的问题
    博客第一天
    jQuery 无缝轮播
    随鼠标移动
    倒计时
    轮播图
  • 原文地址:https://www.cnblogs.com/purinliang/p/14332781.html
Copyright © 2011-2022 走看看