封装矩阵结构体

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
struct Mat 
{
    vector<vector<int>> mat;
    int n, m;
    Mat(int row, int line, int kind = 0) 
    {
        n = row, m = line;
        mat.assign(n, vector<int>(m, 0));
        if (kind == 1 && n == m) 
        {
            for (int i=0;i<n;i++)
                    mat[i][i] = 1;
        }
        return ;
    }
    static Mat error()
    {
        Mat err(1, 1);
        err.mat[0][0] = -2147483647;
        return err;
    }
    Mat operator+(const Mat &b) const 
    {
        if (n != b.n || m != b.m)
            return Mat::error();
        Mat c(n, m);
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++)
                c.mat[i][j] = mat[i][j] + b.mat[i][j];
        return c;
    }
    Mat operator*(const int lam) const 
    {
        Mat res(n, m);
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++)
                res.mat[i][j] = mat[i][j]*lam;
        return res;
    }
    Mat operator-(const Mat &b) const 
    {
        if (n != b.n || m != b.m)
            return Mat::error();
        Mat c(n, m);
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++)
                c.mat[i][j] = mat[i][j] - b.mat[i][j];
        return c;
    }
    Mat operator*(const Mat &b) const 
    {
        if (m != b.n) return Mat::error();
        Mat c(n, b.m);
        for (int i=0;i<n;i++)
            for (int j=0;j<b.m;j++)
                for (int k=0;k<m;k++)
                    c.mat[i][j] += mat[i][k]*b.mat[k][j];
        return c;
    }
    Mat operator^(const int k) const 
    {
        if (n != m)
            return Mat::error();
        Mat a = *this;
        if (k == 0) 
        {
            Mat I(n, n, 1);
            return I;
        }
        else if (k & 1)
        {
            return (a*(a^(k-1)));
        }
        else 
        {
            Mat half = (a^(k>>1));
            return (half*half);
        }
    }
    friend istream& operator>>(istream &is, Mat &a)
    {
        for (int i=0;i<a.n;i++)
            for (int j=0;j<a.m;j++)
                is >> a.mat[i][j];
        return is;
    }
    friend ostream& operator<<(ostream &os, Mat const &a)
    {
        for (int i=0;i<a.n;i++)
        {
            for (int j=0;j<a.m;j++)
                os << a.mat[i][j] << " ";
            os << '\n';
        }
        return os;
    }
};

int n, k;
signed main()
{
    cin >> n >> k;
    Mat a(n, n);
    cin >> a;
    cout << (a^k);
    return 0;
}

模意义下:

cpp 复制代码
#include <bits/stdc++.h>
#include <climits>
using namespace std;
#define int long long
struct Mat 
{
    vector<vector<int>> mat;
    int n, m, mod;
    Mat(int row, int line, int kind = 0, int new_mod = LLONG_MAX) 
    {
        n = row, m = line, mod = new_mod;
        if (mod == 0)
            exit(114);
        mat.assign(n, vector<int>(m, 0));
        if (kind == 1 && n == m) 
        {
            for (int i=0;i<n;i++)
                    mat[i][i] = 1;
        }
        return ;
    }
    static Mat error()
    {
        Mat err(1, 1);
        err.mat[0][0] = LLONG_MIN;
        return err;
    }
    Mat operator+(const Mat &b) const 
    {
        if (n != b.n || m != b.m)
            return Mat::error();
        Mat c(n, m, 0, mod);
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++)
                c.mat[i][j] = (mat[i][j] + b.mat[i][j]) % mod;
        return c;
    }
    Mat operator*(int lam) const 
    {
        Mat res(n, m, 0, mod);
        lam %= mod;
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++)
                res.mat[i][j] = (mat[i][j]*lam)%mod;
        return res;
    }
    Mat operator-(const Mat &b) const 
    {
        if (n != b.n || m != b.m)
            return Mat::error();
        Mat c(n, m, 0, mod);
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++)
                c.mat[i][j] = (mat[i][j] - b.mat[i][j] + mod)%mod;
        return c;
    }
    Mat operator*(const Mat &b) const 
    {
        if (m != b.n) return Mat::error();
        Mat c(n, b.m, 0, mod);
        for (int i=0;i<n;i++)
            for (int j=0;j<b.m;j++)
                for (int k=0;k<m;k++)
                    c.mat[i][j] += (mat[i][k]*b.mat[k][j])%mod, c.mat[i][j] %= mod;
        return c;
    }
    Mat operator^(const int k) const 
    {
        if (n != m)
            return Mat::error();
        Mat a = *this;
        if (k == 0) 
        {
            Mat I(n, n, 1);
            return I;
        }
        else if (k & 1)
        {
            return (a*(a^(k-1)));
        }
        else 
        {
            Mat half = (a^(k>>1));
            return (half*half);
        }
    }
    friend istream& operator>>(istream &is, Mat &a)
    {
        for (int i=0;i<a.n;i++)
            for (int j=0;j<a.m;j++)
                is >> a.mat[i][j];
        return is;
    }
    friend ostream& operator<<(ostream &os, Mat const &a)
    {
        for (int i=0;i<a.n;i++)
        {
            for (int j=0;j<a.m;j++)
                os << a.mat[i][j] << " ";
            os << '\n';
        }
        return os;
    }
};

int n, k;
signed main()
{
    cin >> n >> k;
    Mat a(n, n, 1, (int)(1e9+7));
    cin >> a;
    cout << (a^k);
    return 0;
}
相关推荐
变量未定义~1 小时前
字符串哈希匹配字符串
数据结构·算法·哈希算法
周末也要写八哥1 小时前
浅谈二叉树的深度优先搜索(DFS)算法
算法·深度优先
y = xⁿ2 小时前
20天速通LeetCodeday17:一维动态规划
算法
bnmoel2 小时前
数据结构深度剖析栈与队列:结构、边界实现与进出操作全解析
c语言·数据结构·算法··队列
05候补工程师2 小时前
【考研线代笔记】相似对角化与实对称矩阵:判定法则、计算技巧与物理本质
笔记·线性代数·考研·矩阵
WL_Aurora2 小时前
Python 算法基础篇之查找算法(一):顺序查找、二分查找与插值查找
开发语言·python·算法
ChoSeitaku2 小时前
06_可变参数_递归_类和对象_封装
java·数据结构·算法
-To be number.wan2 小时前
算法日记 | 动态规划(初级)
算法·动态规划
_深海凉_2 小时前
LeetCode热题100-二叉搜索树中第 K 小的元素
算法·leetcode·职场和发展