#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, K, M; cin >> N >> M >> K; long long q = 1LL * N * N / M; vector> ans(N, vector(N, 0)); vector cnt(M + 1, 0); // 各 mod K の行数・列数 vector num(K); for (int r = 0; r < K; r++) { num[r] = (N + K - 1 - r) / K; } // size <= q の剰余類だけ候補にする vector> classes; for (int r = 0; r < K; r++) { for (int c = 0; c < K; c++) { long long sz = 1LL * num[r] * num[c]; if (sz <= q) { classes.emplace_back(sz, r, c); } } } // 小さい剰余類から使う sort(classes.begin(), classes.end()); int take = min(M, (int)classes.size()); // 選べるだけ剰余類を色に割り当てる for (int color = 1; color <= take; color++) { auto [sz, r, c] = classes[color - 1]; for (int i = r; i < N; i += K) { for (int j = c; j < N; j += K) { ans[i][j] = color; cnt[color]++; } } } // 残りの空きマスを、各色が q 個になるように適当に埋める int cur = 1; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (ans[i][j] != 0) continue; while (cur <= M && cnt[cur] == q) { cur++; } ans[i][j] = cur; cnt[cur]++; } } // 出力 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (j) cout << ' '; cout << ans[i][j]; } cout << '\n'; } return 0; }