#include #define show(x) cerr << #x << " = " << x << endl using namespace std; using ll = long long; using pii = pair; using vi = vector; template ostream& operator<<(ostream& os, const vector& v) { os << "sz=" << v.size() << "\n["; for (const auto& p : v) { os << p << ","; } os << "]\n"; return os; } template ostream& operator<<(ostream& os, const pair& p) { os << "(" << p.first << "," << p.second << ")"; return os; } constexpr ll MOD = 1e9 + 7; template constexpr T INF = numeric_limits::max() / 100; int main() { cin.tie(0); ios::sync_with_stdio(false); int n, m; cin >> n >> m; vector> A(m, vector(m, 0)); for (ll i = 0; i < m; i++) { for (ll j = 0; j < m; j++) { cin >> A[i][j]; } } vector>> dp(m + 1, vector>(m, vector(m, -INF))); for (ll i = 0; i < m; i++) { dp[0][i][i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < m; j++) { for (ll k = 0; k < m; k++) { for (ll l = 0; l < m; l++) { if (dp[i][j][l] > -INF) { dp[i + 1][j][k] = max(dp[i + 1][j][k], dp[i][j][l] + A[l][k]); } } } } } ll maximum = 0; for (ll p = 1; p <= m; p++) { const ll loop = (n - 1) / p; const int rest = (n - 1) % p; ll maxi = 0; for (int i = 0; i < m; i++) { const ll loopscore = loop * dp[p][i][i]; ll restmax = 0; for (int j = 0; j <= rest; j++) { ll tmp1 = 0; for (int k = 0; k < m; k++) { tmp1 = max(tmp1, dp[j][k][i]); } ll tmp2 = 0; for (int k = 0; k < m; k++) { tmp2 = max(tmp2, dp[rest - j][i][k]); } restmax = max(restmax, tmp1 + tmp2); } maxi = max(maxi, restmax + loopscore); } maximum = max(maximum, maxi); } cout << maximum << endl; return 0; }