#include <bits/stdc++.h>
using i64 = long long;
#ifdef DEBUG
#include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
#define debug(...) void(23)
#endif
i64 get_min(i64 n) {
i64 res;
if (n % 2 == 1) {
i64 x = (n - 1) / 2;
res = x * (x - 1) / 2 * n;
} else {
i64 x = n / 2;
res = x * (x - 1) / 2 * n / 2 + (x - 1) * (x - 2) / 2 * n / 2;
}
return res;
}
void solve() {
int N;
i64 M;
std::cin >> N >> M;
M = 1LL * N * (N - 1) * (N - 2) / 6 - M;
debug(M);
if (M < get_min(N)) {
std::cout << "No\n";
return;
}
i64 initM = M;
std::cout << "Yes\n";
std::vector<int> d(N);
std::vector<std::vector<int>> g(N);
for (int i = 0; i < N; ++i) {
g[i].resize(i);
}
for (int i = N - 1; i >= 0; --i) {
if (get_min(i) <= M - i * (i - 1) / 2) {
d[i] = i;
M -= i * (i - 1) / 2;
for (int j = 0; j < i; ++j) {
g[i][j] = 1;
}
continue;
}
if (i % 2 == 0) {
for (int j = 0; j <= i; ++j) {
d[j] = i / 2;
}
} else {
for (int j = 0; j <= i; ++j) {
if (j <= i / 2) {
d[j] = i / 2;
} else {
d[j] = i / 2 + 1;
}
}
}
{
std::vector<int> td = d;
for (int j = i; j >= 0; --j) {
assert(td[j] <= j);
for (int k = 0; k < j - td[j]; ++k) {
assert(td[k] >= 1);
g[j][k] = 0;
td[k] -= 1;
}
for (int k = j - td[j]; k < j; ++k) {
g[j][k] = 1;
}
}
}
debug(d);
i64 now = get_min(i + 1);
std::vector<std::vector<int>> aux(N);
std::queue<std::pair<int, int>> que;
for (int j = 0; j <= i; ++j) {
aux[d[j]].emplace_back(j);
}
for (int j = 0; j <= i; ++j) {
if (aux[j].size() >= 2) {
que.emplace(aux[j].size(), j);
}
}
debug(M - now);
while (now != M) {
// debug(now, M);
while (!que.empty() && aux[que.front().second].size() != que.front().first) {
que.pop();
}
assert(!que.empty());
int id = que.front().second;
int p = -1, q;
assert (aux[id].size() >= 2);
p = aux[id].back();
aux[id].pop_back();
q = aux[id].back();
aux[id].pop_back();
assert(p != -1);
if (p > q) {
std::swap(p, q);
}
if (g[q][p]) {
d[q] -= 1;
d[p] += 1;
g[q][p] = 0;
} else {
d[p] -= 1;
d[q] += 1;
g[q][p] = 1;
}
aux[d[p]].emplace_back(p);
aux[d[q]].emplace_back(q);
if (aux[id].size() >= 2) {
que.emplace(aux[id].size(), id);
}
if (aux[d[p]].size() >= 2) {
que.emplace(aux[d[p]].size(), d[p]);
}
if (aux[d[q]].size() >= 2) {
que.emplace(aux[d[q]].size(), d[q]);
}
now += 1;
}
break;
}
debug(d);
for (int i = 1; i < N; ++i) {
for (int j = 0; j < i; ++j) {
std::cout << g[i][j];
}
std::cout << '\n';
}
#ifdef LOCAL
i64 sum = 0;
std::vector<int> ds;
for (int i = 0; i < N; ++i) {
int x = 0;
for (int j = 0; j < i; ++j) {
x += g[i][j];
}
for (int j = i + 1; j < N; ++j) {
x += !g[j][i];
}
debug(x);
sum += x * (x - 1) / 2;
ds.emplace_back(x);
}
debug(sum);
assert(sum == initM);
std::sort(ds.begin(), ds.end());
std::sort(d.begin(), d.end());
debug(d);
debug(ds);
assert(d == ds);
sum = 0;
for (int i = 0; i < N; ++i) {
sum += d[i];
if (sum < i * (i + 1) / 2) {
assert(false);
}
}
assert(sum == N * (N - 1) / 2);
#endif
return;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int TT = 1; std::cin >> TT;
for (int i = 1; i <= TT; ++i) {
solve();
}
return 0;
}