rt,AC on #10
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110;
#define mod 1000000007
struct Matrix {
int n, m;
ll mat[N][N];
Matrix(int a = 0, int b = 0, ll value = 0) {
n = a;
m = b;
for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) mat[i][j] = value;
}
Matrix operator = (Matrix b) {
Matrix a(b.n, b.m);
for (int i = 0; i < a.n; i++)
for (int j = 0; j < a.m; j++)
a.mat[i][j] = b.mat[i][j];
return a;
}
};
Matrix demax(int n) {
Matrix ans(n, n, 0);
for (int i = 0; i < n; i++) ans.mat[i][i] = 1;
return ans;
}
istream& operator >> (istream& in, Matrix& a) {
for (int i = 0; i < a.n; i++)
for (int j = 0; j < a.m; j++)
in >> a.mat[i][j];
return in;
}
ostream& operator<< (ostream& out, Matrix a) {
for (int i = 0; i < a.n; i++) {
for (int j = 0; j < a.m; j++)
out << a.mat[i][j] << " ";
out << "\n";
}
return out;
}
void swap(Matrix& a, Matrix& b) {
Matrix t;
t = a;
a = b;
b = t;
}
Matrix operator + (Matrix a, Matrix& b) {
Matrix ans(a.n, a.m);
for (int i = 0; i < ans.n; i++)
for (int j = 0; j < ans.m; j++)
ans.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % mod;
return ans;
}
Matrix operator * (Matrix a, Matrix b) {
if (a.n != b.m && a.m != b.n) raise(1);
if (a.m != b.n) swap(a, b);
Matrix ans(a.n, b.m);
for (int i = 0; i < ans.n; i++)
for (int j = 0; j < ans.m; j++)
for (int k = 0; k < a.m; k++) {
ans.mat[i][j] += (a.mat[i][k] * b.mat[k][j]) % mod;
ans.mat[i][j] %= mod;
}
return ans;
}
Matrix operator %(Matrix a, int p) {
for (int i = 0; i < a.n; i++)
for (int j = 0; j < a.m; j++)
a.mat[i][j] %= p;
return a;
}
Matrix quickly_pow(Matrix a, ll p) {
if (p == 0) return demax(a.n);
Matrix ans = quickly_pow(a, p / 2);
// cout << a << ans << p << "\n";
ans = ans * ans;
// cout << a << ans << p << "\n";
if (p % 2 == 1) {
ans = ans * a;
// cout << a << ans << p << "\n";
}
return ans;
}
int n;
ll k;
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> k;
Matrix a(n, n);
cin >> a;
cout << quickly_pow(a, k);
return 0;
}