封装矩阵结构体

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;
}
相关推荐
LabVIEW开发30 分钟前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
纪念 2291 小时前
C++算法(六)
开发语言·c++·算法
Dumbness2 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法
taka2 小时前
从 24x 到 141x:我用纯 Python 零依赖项目,扒开了 GPU 加速的性能黑洞
算法
UIU1142 小时前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
旖旎夜光2 小时前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
像风一样自由20203 小时前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
D e re k ZH3 小时前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
Nuanyt3 小时前
LeetCode Hot 100 链表专题2 3 题 (Java)
java·笔记·算法·leetcode·链表