本地测试时,发现在 main 函数开头加上 cout << "inside main()" << endl; 无任何输出,而删除 main 主体部分,只保留 cin >> n >> k; return 0; 则可以正常运行。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1009;
const ll mod = 1e9+7;
class Matrix {
public:
int r,c;
ll data[N][N];
Matrix(int _r, int _c)
{
r = _r; c = _c;
memset(data, 0, sizeof data);
}
void reset(int _r, int _c)
{
r = _r; c = _c;
memset(data, 0, sizeof data);
}
void debug()
{
cout << r << ' ' << c << endl;
for (int i = 0; i < r; ++i,cout << endl)
for (int j = 0; j < c; ++j)
cout << data[i][j] << ' ';
}
Matrix operator = (Matrix m)
{
r = m.r; c = m.c;
memset(data, 0, sizeof data);
for (int i = 0; i < r; ++i)
for (int j = 0; j < c; ++j)
data[i][j] = m.data[i][j];
return *this;
}
Matrix operator + (Matrix m)
{
Matrix ret(r, c);
if (r != m.r || c != m.c) return ret;
for (int i = 0; i < r; ++i)
for (int j = 0; j < c; ++j)
ret.data[i][j] = (data[i][j] + m.data[i][j]) % mod;
return ret;
}
Matrix operator += (Matrix m)
{
if (r != m.r || c != m.c) return *this;
for (int i = 0; i < r; ++i)
for (int j = 0; j < c; ++j)
data[i][j] = (data[i][j] + m.data[i][j]) % mod;
return *this;
}
Matrix operator * (Matrix m)
{
Matrix ret(r, m.c);
if (c != m.r) return ret;
for (int i = 0; i < r; ++i)
for (int j = 0; j < m.c; ++j)
for (int k = 0; k < c; ++k)
ret.data[i][j] = (ret.data[i][j] + data[i][k] * m.data[k][j] % mod) % mod;
return ret;
}
Matrix operator *= (Matrix m) {return (*this) = (*this) * m;}
Matrix operator ^ (int b)
{
Matrix ret(r, c);
if (r != c && b > 1) return ret;
for (int i = 0; i < r; ++i) ret.data[i][i] = 1;
Matrix a = *this;
while (b)
{
if (b & 1) ret *= a;
a *= a;
b >>= 1;
}
return ret;
}
};
ll n,k;
int main()
{
cin >> n >> k;
Matrix a(n, n);
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
cin >> a.data[i][j];
Matrix b = a ^ k;
for (int i = 0; i < n; ++i,cout << endl)
for (int j = 0; j < n; ++j)
cout << b.data[i][j] << ' ';
return 0;
}