封装矩阵结构体

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;
}
相关推荐
To_OC1 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎2 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC3 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn3 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹4 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
雪碧聊技术4 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划
CV-Climber7 小时前
检索技术的实际应用
人工智能·算法
hhzz7 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
从零开始的代码生活_8 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法