#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define pii pair<ll, ll>
#define st first
#define nd second
#define file "test"
#define FOR(i,l,r) for (int i=l;i<=r;i++)
#define FOD(i,r,l) for (int i=r;i>=l;i--)
using namespace std;
const ll MOD = 1e9 + 7;
const ll INF = 1e18;
const int N = 64 + 5;
int f[N][N];
int n;
void resultError()
{
cout << "This is not Magic Square!" << "\n";
}
bool mgCheck()
{
int Val = (n*(n*n+1))/2;
int sumCol[100], sumRow[100], priA = 0, secA = 0;
memset(sumCol,0,sizeof(sumCol));
memset(sumRow,0,sizeof(sumRow));
FOR(i,0,n-1)
{
FOR(j,0,n-1)
{
sumRow[i] += f[i][j];
sumCol[j] += f[i][j];
if(i == j) priA += f[i][j];
if(i+j == (n-1)*2) secA += f[i][j];
}
}
FOR(i,0,n-1)
{
if(sumRow[i] != Val || sumCol[i] != Val) {resultError(); return 0;}
}
if(priA != Val && secA != Val) {resultError(); return 0;}
return 1;
}
void mgOdd()
{
int i = 0, j = n >> 1;
FOR(t,1,n*n)
{
f[i][j] = t;
if(i == 0 && j == n-1) i++;
else
i = (i-1+n)%n, j = (j+1)%n;
if(f[i][j]!=0) i+=2, j-=1;
}
}
//The Magic Square 4n
void mgEven()
{
int val = 0;
FOR(i,0,n-1)
{
FOR(j,0,n-1)
{
val++;
if(i%4 - j%4 == 0 || i%4 + j%4 == 3) f[i][j] = val;
}
}
val = 0;
FOD(i,n-1,0)
{
FOD(j,n-1,0)
{
val++;
if(!f[i][j]) f[i][j] = val;
}
}
}
bool typeL(int i, int j, int m)
{
int sl = n / 4 + 1;
if(i==m && j==m) return false;
if(i==m+1 && j == m) return true;
if(i < sl) return true;
return false;
}
bool typeU(int i, int j, int m)
{
int sl = n / 4 + 1;
if(i==m && j == m) return true;
if(i==sl && j == m) return false;
if(i==sl) return true;
return false;
}
const int dx[5] = {-1,0,0,-1};
const int dy[5][5] =
{{0,-1,0,-1},//L
{-1,-1,0,0},//U
{-1,0,-1,0}//X
};
void mgfill(int i, int j, int m, int &val)
{
int x = i*2 + 1, y = j * 2 + 1;
/*
N = 4n + 2
-> L : n + 1 rows
-> U : 1 rows
-> X : n - 1 rows;
*/
//loai L : 0, U : 1, X : 2
int t = 2;
if(typeL(i,j,m >> 1)) t = 0;
else
if(typeU(i,j,m >> 1)) t = 1;
FOR(i,0,3)
{
f[x + dx[i]][y + dy[t][i]] = val;
val++;
}
}
//The Magic Square 4n+2
void mgEvenOdd()
{
int m = n >> 1;
bool mark[100][100];
memset(mark, 0, sizeof(mark));
int i = 0, j = m >> 1;
int val = 1;
FOR(t,1,m*m)
{
mark[i][j] = 1;
mgfill(i,j,m,val);
if(i == 0 && j == m-1) i++;
else
i = (i-1+n)%m, j = (j+1)%m;
if(mark[i][j]!=0) i+=2, j-=1;
}
}
void solve()
{
cin >> n;
if(n&1)
mgOdd();
if(n%4 == 0)
mgEven();
else
mgEvenOdd();
if(mgCheck())
{
FOR(i,0,n-1)
{
FOR(j,0,n-1)
cout << f[i][j] << " ";
cout << "\n";
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
#ifndef ONLINE_JUDGE
//
// -> remember change the file name!!! <-
//
freopen(file".inp","r",stdin); freopen(file".out","w",stdout);
#endif
solve();
return 0;
}
/**
^ ++
/O\ ++
|___|
/___\
WMWMW
**/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZwojZGVmaW5lIHBpaSBwYWlyPGxsLCBsbD4KI2RlZmluZSBzdCBmaXJzdAojZGVmaW5lIG5kIHNlY29uZAojZGVmaW5lIGZpbGUgInRlc3QiCiNkZWZpbmUgRk9SKGksbCxyKSBmb3IgKGludCBpPWw7aTw9cjtpKyspCiNkZWZpbmUgRk9EKGkscixsKSBmb3IgKGludCBpPXI7aT49bDtpLS0pCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGxsIE1PRCA9IDFlOSArIDc7CmNvbnN0IGxsIElORiA9IDFlMTg7CmNvbnN0IGludCBOID0gNjQgKyA1OwoKaW50IGZbTl1bTl07CmludCBuOwp2b2lkIHJlc3VsdEVycm9yKCkKewogICAgY291dCA8PCAiVGhpcyBpcyBub3QgTWFnaWMgU3F1YXJlISIgPDwgIlxuIjsKfQpib29sIG1nQ2hlY2soKQp7CiAgICBpbnQgVmFsID0gKG4qKG4qbisxKSkvMjsKICAgIGludCBzdW1Db2xbMTAwXSwgc3VtUm93WzEwMF0sIHByaUEgPSAwLCBzZWNBID0gMDsKICAgIG1lbXNldChzdW1Db2wsMCxzaXplb2Yoc3VtQ29sKSk7CiAgICBtZW1zZXQoc3VtUm93LDAsc2l6ZW9mKHN1bVJvdykpOwogICAgRk9SKGksMCxuLTEpCiAgICB7CiAgICAgICAgRk9SKGosMCxuLTEpCiAgICAgICAgewogICAgICAgICAgICBzdW1Sb3dbaV0gKz0gZltpXVtqXTsKICAgICAgICAgICAgc3VtQ29sW2pdICs9IGZbaV1bal07CiAgICAgICAgICAgIGlmKGkgPT0gaikgcHJpQSArPSBmW2ldW2pdOwogICAgICAgICAgICBpZihpK2ogPT0gKG4tMSkqMikgc2VjQSArPSBmW2ldW2pdOwogICAgICAgIH0KICAgIH0KICAgIEZPUihpLDAsbi0xKQogICAgewogICAgICAgIGlmKHN1bVJvd1tpXSAhPSBWYWwgfHwgc3VtQ29sW2ldICE9IFZhbCkge3Jlc3VsdEVycm9yKCk7IHJldHVybiAwO30KICAgIH0KICAgIGlmKHByaUEgIT0gVmFsICYmIHNlY0EgIT0gVmFsKSB7cmVzdWx0RXJyb3IoKTsgcmV0dXJuIDA7fQogICAgcmV0dXJuIDE7Cn0Kdm9pZCBtZ09kZCgpCnsKICAgIGludCBpID0gMCwgaiA9IG4gPj4gMTsKICAgIEZPUih0LDEsbipuKQogICAgewogICAgICAgIGZbaV1bal0gPSB0OwogICAgICAgIGlmKGkgPT0gMCAmJiBqID09IG4tMSkgaSsrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaSA9IChpLTErbiklbiwgaiA9IChqKzEpJW47CiAgICAgICAgaWYoZltpXVtqXSE9MCkgaSs9Miwgai09MTsKICAgIH0KfQoKLy9UaGUgTWFnaWMgU3F1YXJlIDRuCnZvaWQgbWdFdmVuKCkKewogICAgaW50IHZhbCA9IDA7CiAgICBGT1IoaSwwLG4tMSkKICAgIHsKICAgICAgICBGT1IoaiwwLG4tMSkKICAgICAgICB7CiAgICAgICAgICAgIHZhbCsrOwogICAgICAgICAgICBpZihpJTQgLSBqJTQgPT0gMCB8fCBpJTQgKyBqJTQgPT0gMykgZltpXVtqXSA9IHZhbDsKICAgICAgICB9CiAgICB9CiAgICB2YWwgPSAwOwogICAgRk9EKGksbi0xLDApCiAgICB7CiAgICAgICAgRk9EKGosbi0xLDApCiAgICAgICAgewogICAgICAgICAgICB2YWwrKzsKICAgICAgICAgICAgaWYoIWZbaV1bal0pIGZbaV1bal0gPSB2YWw7CiAgICAgICAgfQogICAgfQp9Cgpib29sIHR5cGVMKGludCBpLCBpbnQgaiwgaW50IG0pCnsKICAgIGludCBzbCA9IG4gLyA0ICsgMTsKICAgIGlmKGk9PW0gJiYgaj09bSkgcmV0dXJuIGZhbHNlOwogICAgaWYoaT09bSsxICYmIGogPT0gbSkgcmV0dXJuIHRydWU7CiAgICBpZihpIDwgc2wpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwp9Cgpib29sIHR5cGVVKGludCBpLCBpbnQgaiwgaW50IG0pCnsKICAgIGludCBzbCA9IG4gLyA0ICsgMTsKICAgIGlmKGk9PW0gJiYgaiA9PSBtKSByZXR1cm4gdHJ1ZTsKICAgIGlmKGk9PXNsICYmIGogPT0gbSkgcmV0dXJuIGZhbHNlOwogICAgaWYoaT09c2wpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwp9CmNvbnN0IGludCBkeFs1XSA9IHstMSwwLDAsLTF9Owpjb25zdCBpbnQgZHlbNV1bNV0gPQp7ezAsLTEsMCwtMX0sLy9MCnstMSwtMSwwLDB9LC8vVQp7LTEsMCwtMSwwfS8vWAp9Owp2b2lkIG1nZmlsbChpbnQgaSwgaW50IGosIGludCBtLCBpbnQgJnZhbCkKewogICAgaW50IHggPSBpKjIgKyAxLCB5ID0gaiAqIDIgKyAxOwogICAgLyoKICAgICAgICBOID0gNG4gKyAyCiAgICAgICAgLT4gTCA6IG4gKyAxIHJvd3MKICAgICAgICAtPiBVIDogMSByb3dzCiAgICAgICAgLT4gWCA6IG4gLSAxIHJvd3M7CiAgICAqLwoKICAgIC8vbG9haSBMIDogMCwgVSA6IDEsIFggOiAyCiAgICBpbnQgdCA9IDI7CiAgICBpZih0eXBlTChpLGosbSA+PiAxKSkgdCA9IDA7CiAgICBlbHNlCiAgICBpZih0eXBlVShpLGosbSA+PiAxKSkgdCA9IDE7CiAgICAKICAgIEZPUihpLDAsMykKICAgIHsKICAgICAgICBmW3ggKyBkeFtpXV1beSArIGR5W3RdW2ldXSA9IHZhbDsKICAgICAgICB2YWwrKzsKICAgIH0KfQovL1RoZSBNYWdpYyBTcXVhcmUgNG4rMgp2b2lkIG1nRXZlbk9kZCgpCnsKICAgIGludCBtID0gbiA+PiAxOwogICAgYm9vbCBtYXJrWzEwMF1bMTAwXTsKCiAgICBtZW1zZXQobWFyaywgMCwgc2l6ZW9mKG1hcmspKTsKCiAgICBpbnQgaSA9IDAsIGogPSBtID4+IDE7CiAgICBpbnQgdmFsID0gMTsKCiAgICBGT1IodCwxLG0qbSkKICAgIHsKICAgICAgICBtYXJrW2ldW2pdID0gMTsKCiAgICAgICAgbWdmaWxsKGksaixtLHZhbCk7CgogICAgICAgIGlmKGkgPT0gMCAmJiBqID09IG0tMSkgaSsrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaSA9IChpLTErbiklbSwgaiA9IChqKzEpJW07CgogICAgICAgIGlmKG1hcmtbaV1bal0hPTApIGkrPTIsIGotPTE7CiAgICB9CiAgICAKfQp2b2lkIHNvbHZlKCkKewogICAgY2luID4+IG47CiAgICBpZihuJjEpCiAgICAgICAgbWdPZGQoKTsKICAgIGlmKG4lNCA9PSAwKQogICAgICAgIG1nRXZlbigpOwogICAgZWxzZQogICAgICAgIG1nRXZlbk9kZCgpOwogICAgaWYobWdDaGVjaygpKQogICAgewogICAgICAgIEZPUihpLDAsbi0xKQogICAgICAgIHsKICAgICAgICAgICAgRk9SKGosMCxuLTEpCiAgICAgICAgICAgICAgICBjb3V0IDw8IGZbaV1bal0gPDwgIiAiOwogICAgICAgICAgICBjb3V0IDw8ICJcbiI7CiAgICAgICAgfQogICAgfQp9CmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgI2lmbmRlZiBPTkxJTkVfSlVER0UKLy8KICAgIC8vIC0+IHJlbWVtYmVyIGNoYW5nZSB0aGUgZmlsZSBuYW1lISEhIDwtCi8vCiAgICAgICAgZnJlb3BlbihmaWxlIi5pbnAiLCJyIixzdGRpbik7IGZyZW9wZW4oZmlsZSIub3V0IiwidyIsc3Rkb3V0KTsKICAgICNlbmRpZgogICAgc29sdmUoKTsKCiAgICByZXR1cm4gMDsKfQovKioKICBeICsrCiAvT1wgKysKfF9fX3wKL19fX1wKV01XTVcKKiovCg==