#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long int ll; typedef pair pii; typedef tuple t3; using namespace std; ll n, m; vector>> mat; vector> add(const vector>& s) { auto p = vector>(m, vector(m, 0)); for(int y1 = 0;y1 < m;y1++) { for(int x1 = 0;x1 < m;x1++) { for(int y2 = 0;y2 < m;y2++) { p[y1][x1] = max(p[y1][x1], s[y2][x1] + s[y1][y2]); } } } return p; } vector> add(const vector>& l,const vector>& r) { auto p = vector>(m, vector(m, 0)); for(int y1 = 0;y1 < m;y1++) { for(int x1 = 0;x1 < m;x1++) { for(int y2 = 0;y2 < m;y2++) { p[y1][x1] = max(p[y1][x1], l[y2][x1] + r[y1][y2]); } } } return p; } int main() { cin >> n >> m; mat.emplace_back(); mat[0].assign(m, vector(m, 0)); for(int y = 0;y < m;y++) { for(int x = 0;x < m;x++) { cin>> mat[0][y][x]; } } for(int i = 1, j = 1;j <= n;i++, j*=2) { mat.emplace_back(add(mat[i-1])); } auto ret = vector>(m, vector(m, 0)); int i = 0; n--; while(n > 0) { if(n & 1) { ret = add(ret, mat[i]); } n>>=1; i++; } ll r = 0; for(int y = 0;y < m;y++) { for(int x = 0;x < m;x++) { r = max(r, ret[y][x]); } } cout << r << endl; return 0; }