封装矩阵结构体

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;
}
相关推荐
Selvaggia15 分钟前
Diffusion Model 的基本原理与模型架构
算法
wabs6662 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin032 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao2 小时前
算法50,分治归并,数组中的逆序对
java·算法
阳明山水3 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
别动我齐刘海4 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
zhangfeng11334 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu
0+1114 小时前
算法 --滑动窗口
c++·算法·leetcode
reikocao5 小时前
大场景下 Hessian 特征值放大与退化检测
算法
hetao17338375 小时前
2026-09-18 hetao1733837 的刷题记录
c++·算法