#include<bits/stdc++.h>
using namespace std;
int ans[5001][5001];
vector<int> idk[5001];
void solve() {
long long n,m;
cin >> n >> m;
for(int i = 0; i < n; i++) {
idk[i].clear();
for(int j = 0; j < n; j++) {
ans[i][j] = 0;
}
}
int k = -1,br = -1;
for(long long i = 1; i <= n; i++) {
br = i*(i-1LL)*(i-2LL)/6LL;
long long z = (i-1)/2;
if(i%2) {
br-=(z*(z-1)/2)*i;
}
else {
br-=(i/2)*(z*(z-1)/2+z*(z+1)/2);
}
if(br >= m) {
k = i;
break;
}
}
if(k == -1) {
cout << "No\n";
return;
}
br-=m;
vector<int> outd(n);
for(int i = 1; i <= (k-1)/2; i++) {
for(int j = 0; j < k; j++) {
outd[j]++;
ans[j][(j+i)%k] = 1;
}
}
if(k%2 == 0) {
for(int i = 0; i < k/2; i++) {
outd[i]++;
ans[i][i+k/2] = 1;
}
}
for(int i = k; i < n; i++) {
for(int j = 0; j < i; j++) {
outd[i]++;
ans[i][j] = 1;
}
}
for(int i = 0; i < n; i++) {
idk[outd[i]].push_back(i);
}
queue<int> banana;
for(int i = 0; i < n; i++) {
if(idk[i].size()) {
banana.push(i);
}
}
while(br > 0) {
int x = banana.front();
banana.pop();
if(idk[x].size() < 2) {
continue;
}
int a = idk[x][idk[x].size()-1],b = idk[x][idk[x].size()-2];
idk[x].pop_back();
idk[x].pop_back();
if(ans[a][b] == 0) {
swap(a,b);
}
ans[a][b] = 0;
ans[b][a] = 1;
idk[x-1].push_back(a);
idk[x+1].push_back(b);
if(idk[x-1].size() >= 2) {
banana.push(x-1);
}
if(idk[x+1].size() >= 2) {
banana.push(x+1);
}
br--;
}
cout << "Yes\n";
for(int i = 1; i < n; i++) {
for(int j = 0; j < i; j++) {
cout << ans[i][j];
}
cout << "\n";
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}