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;
}