封装矩阵结构体

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;
}
相关推荐
信奥卷王9 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵9 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
徐小黑ACG10 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z11 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
数智工坊11 小时前
视觉SLAM第12讲|地图构建:单目稠密重建、RGB-D点云与八叉树地图全解析
人工智能·深度学习·矩阵·机器人
北极有牛11 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记11 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序12 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室12 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法