#include <ctime>
#include <random>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1012345678;
const double TLE = 1.0;
mt19937 mt(1903312138);
unsigned curseed = 1903312138;
inline unsigned xorshift() {
	curseed ^= (curseed << 13);
	curseed ^= (curseed >> 17);
	curseed ^= (curseed << 5);
	return curseed;
}
int rand_rng(int l, int r) {
	return l + xorshift() % (r - l);
}
int B[309][309], S[309][309]; double cost[309][309], dp[309][309], randomval[309][309];
int main() {
	cin.tie(0);
	ios_base::sync_with_stdio(false);
	int T, N, K1, K2;
	cin >> T >> N >> K1 >> K2;
	int X = N * N;
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			B[i][j] = rand() % 2; //cin >> B[i][j];
			X -= B[i][j];
		}
	}
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			S[i][j + 1] = S[i][j] + B[i][j];
		}
	}
	int score = inf;
	vector<int> optseq;
	while (clock() < CLOCKS_PER_SEC * TLE * 0.5) {
		double l = 0, r = 1;
		vector<int> lastseq;
		int lastsum = inf;
		uniform_real_distribution<double> plim(0, 1);
		uniform_real_distribution<double> px(0, pow(plim(mt), 6) * N);
		for (int i = 0; i < N; ++i) {
			for (int j = 0; j <= N; ++j) {
				randomval[i][j] = px(mt);
			}
		}
		for (int rep = 0; rep < 40; ++rep) {
			double m = (l + r) * 0.5;
			for (int i = 0; i < N; ++i) {
				for (int j = 0; j <= N; ++j) {
					cost[i][j] = S[i][j] * m + 1LL * ((N - j) - (S[i][N] - S[i][j])) * (1 - m) + randomval[i][j];
				}
			}
			for (int i = N - 1; i >= 0; --i) {
				for (int j = 0; j < N; ++j) {
					dp[i][j] = dp[i + 1][j] + cost[i][j];
					if (j >= 1) dp[i][j] = min(dp[i][j], dp[i][j - 1]);
				}
			}
			vector<int> seq(N);
			int cur = N;
			int sum = 0;
			for (int i = 0; i < N; ++i) {
				vector<int> cand;
				for (int j = 0; j <= cur; ++j) {
					if (abs(dp[i][j] - cost[i][j] - dp[i + 1][j]) <= 1.0e-9) {
						cand.push_back(j);
					}
				}
				cur = cand.back();
				seq[i] = cur;
				sum += seq[i];
			}
			if (abs(lastsum - X) > abs(sum - X)) {
				lastseq = seq;
				lastsum = sum;
			}
			if (sum < X) r = m;
			else l = m;
		}
		while (lastsum != X) {
			if (lastsum < X) {
				vector<int> cand;
				for (int i = 0; i < N; ++i) {
					if (lastseq[i] != (i == 0 ? N : lastseq[i - 1])) {
						cand.push_back(i);
					}
				}
				++lastseq[cand[rand_rng(0, cand.size())]];
				++lastsum;
			}
			if (lastsum > X) {
				vector<int> cand;
				for (int i = 0; i < N; ++i) {
					if (lastseq[i] != (i == N - 1 ? 0 : lastseq[i + 1])) {
						cand.push_back(i);
					}
				}
				--lastseq[cand[rand_rng(0, cand.size())]];
				--lastsum;
			}
			for (int i = 0; i < N; ++i) {
				if (lastsum < X) {
					while (lastseq[i] != (i == 0 ? N : lastseq[i - 1]) && B[i][lastseq[i]] == 0) ++lastseq[i], ++lastsum;
				}
				if (lastsum > X) {
					if (i <= N - 2 && lastseq[i] == lastseq[i + 1]) continue;
					while (lastseq[i] != (i == N - 1 ? 0 : lastseq[i + 1]) && B[i][lastseq[i] - 1] == 0) --lastseq[i], --lastsum;
				}
			}
		}
		int curscore = 0;
		for (int i = 0; i < N; ++i) {
			curscore += S[i][lastseq[i]];
		}
		if (score > curscore) {
			score = curscore;
			optseq = lastseq;
		}
	}
	cerr << "Score for initial solution: " << score << endl;
	int rscore = score;
	vector<int> roptseq = optseq;
	for (int i = 0; ; ++i) {
		if (i % 100 == 0 && clock() > CLOCKS_PER_SEC * TLE * 0.98) break;
		int steps = rand_rng(1, 15);
		vector<int> oldseq = optseq;
		int nxtscore = score;
		for (int j = 0; j < steps; ++j) {
			while (true) {
				int k = rand_rng(0, N);
				if (optseq[k] != N && (k == 0 || optseq[k] < optseq[k - 1])) {
					nxtscore += B[k][optseq[k]];
					++optseq[k];
					break;
				}
			}
			while (true) {
				int k = rand_rng(0, N);
				if (optseq[k] != 0 && (k == N - 1 || optseq[k] > optseq[k + 1])) {
					--optseq[k];
					nxtscore -= B[k][optseq[k]];
					break;
				}
			}
		}
		if (rscore > nxtscore) {
			rscore = score;
			roptseq = optseq;
		}
		if (score >= nxtscore || (nxtscore - score <= 1 && rand_rng(0, 2) == 0)) {
			score = nxtscore;
		}
		else {
			optseq = oldseq;
		}
	}
	cerr << "Score for final solution: " << rscore << endl;
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			if (j) cout << ' ';
			cout << (j < roptseq[i] ? 0 : 1);
		}
		cout << '\n';
	}
	return 0;
}