#include using namespace std; #define int int64_t int mink(int n) { if(n % 2 == 1) { int d = (n - 1) / 2; return n * d * d; } else { int d = (n - 2) / 2; return (n / 2) * (d * d + (d + 1) * (d + 1)); } } int maxk(int n) { int ans = 0; while(n--) { ans += n * n; } return ans; } void solve() { int n, k; cin >> n >> k; if(k < mink(n) || k > maxk(n) || k % 2 != mink(n) % 2) { cout << "-1\n"; return; } vector> g(n, vector(n)); vector sum(n); for(int i = 1; i < n; i += 2) { int u = i / 2; for(int j = 0; j < u; j++) { g[i][j] = 1; sum[i]++; if(i + 1 < n) { g[j][i + 1] = 1; sum[j]++; } } for(int j = u; j < i; j++) { g[j][i] = 1; sum[j]++; if(i + 1 < n) { g[i + 1][j] = 1; sum[i + 1]++; } } if(i + 1 < n) { g[i][i + 1] = 1; sum[i]++; } } int score = 0; for(int i = 0; i < n; i++) { score += norm(sum[i]); } vector used(n); while(score < k) { int mx = -1; for(int i = 0; i < n; i++) { if(!used[i] && (mx == -1 || sum[i] > sum[mx])) { mx = i; } } if(mx == -1) { break; } used[mx] = 1; int found = 0; for(int i = 0; i < n; i++) { if(!used[i] && g[i][mx]) { int dif = norm(sum[mx] + 1) + norm(sum[i] - 1) - norm(sum[mx]) - norm(sum[i]); if(score + dif <= k) { score += dif; g[i][mx] ^= 1; g[mx][i] ^= 1; sum[mx]++; sum[i]--; } else { goto out; } } } } out: while(score < k) { for(int i = 0; i < n && score < k; i++) { for(int j = 0; j < i && score < k; j++) { if(sum[i] == sum[j]) { if(g[i][j]) { sum[i]--, sum[j]++; } else { sum[i]++, sum[j]--; } score += 2; g[i][j] ^= 1; g[j][i] ^= 1; } } } } for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cout << g[i][j]; } cout << "\n"; } } signed main() { //freopen("input.txt", "r", stdin); ios::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while(t--) { solve(); } }