#include using namespace std; using ll = long long; static const ll NEG_INF = (ll)-4e18; // 十分小さい値 int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; long long M; cin >> N >> M; vector T(N); for (int i = 0; i < N; i++) cin >> T[i]; vector> A(N, vector(N)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) cin >> A[i][j]; } auto mat_mul = [&](const vector>& X, const vector>& Y) { vector> Z(N, vector(N, NEG_INF)); for (int i = 0; i < N; i++) { for (int k = 0; k < N; k++) if (X[i][k] != NEG_INF) { for (int j = 0; j < N; j++) if (Y[k][j] != NEG_INF) { __int128 s = (__int128)X[i][k] + (__int128)Y[k][j]; ll v = (ll)s; // 答えが 2^63 未満保証なのでここで溢れない想定 Z[i][j] = max(Z[i][j], v); } } } return Z; }; auto vec_mul = [&](const vector& v, const vector>& X) { vector r(N, NEG_INF); for (int i = 0; i < N; i++) if (v[i] != NEG_INF) { for (int j = 0; j < N; j++) if (X[i][j] != NEG_INF) { __int128 s = (__int128)v[i] + (__int128)X[i][j]; ll vv = (ll)s; r[j] = max(r[j], vv); } } return r; }; // v = T ⊗ A^M を二乗法で作る(行列 res を作らずベクトルに直接当てる) vector v = T; vector> P = A; // 単位(A^0)は「何もしない」だが、今回は v に直接掛けるので不要。 // ただし M のビットが立ったときに v = v ⊗ P を実行する。 while (M > 0) { if (M & 1LL) v = vec_mul(v, P); M >>= 1LL; if (M) P = mat_mul(P, P); // 最後の不要な平方を避ける(好み) } // v が S[M+1](各人に M通目が全員から届く日) for (int i = 0; i < N; i++) { if (i) cout << ' '; cout << v[i]; } cout << '\n'; return 0; }