- Quiz
- AC
- 解説
- 斜めに置いていくとfを小さくできる
- それを作るために、まず縦長に1を配置してから各行でrotateしてずらした
void transpose(VV& A){
ll N = A.size();
rep(i,N){
FOR(j,i+1,N){
swap(A[i][j], A[j][i]);
}
}
}
ll ma_mi(VV& A){
ll N = A.size();
VI B;
rep(i,N){
B.push_back(SUM(A[i]));
}
return MAX(B) - MIN(B);
}
ll f(VV A){
ll a = ma_mi(A);
transpose(A);
ll b = ma_mi(A);
return a*a + b*b;
}
void solve(){
ll N,K;
cin>>N>>K;
VV A(N, VI(N));
ll n = K/N;
rep(x,n){
rep(y,N){
A[y][x]=1;
}
}
ll r = K%N;
rep(y,r){
A[y][n]=1;
}
rep(i,N){
rotate(A[i].begin(), A[i].begin()+N-i, A[i].end());
}
p(f(A));
rep(i,N){
print_vector(A[i]);
}
}
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll N;
cin>>N;
while(N--)solve();
return 0;
}