#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

#define REP(i,x) for(int i=0;i<(int)(x);i++)
#define REPS(i,x) for(int i=1;i<=(int)(x);i++)
#define RREP(i,x) for(int i=((int)(x)-1);i>=0;i--)
#define RREPS(i,x) for(int i=((int)(x));i>0;i--)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RFOR(i,c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)
#define ALL(container) (container).begin(), (container).end()
#define RALL(container) (container).rbegin(), (container).rend()
#define SZ(container) ((int)container.size())
#define mp(a,b) make_pair(a, b)
#define pb push_back
#define eb emplace_back
#define UNIQUE(v) v.erase( unique(v.begin(), v.end()), v.end() );
#define __builtin_popcount __builtin_popcountll

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
    os<<"["; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"]"; return os;
}
template<class T> ostream& operator<<(ostream &os, const set<T> &t) {
    os<<"{"; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"}"; return os;
}
template<class S, class T> ostream& operator<<(ostream &os, const map<S, T> &t) {
    os<<"{"; FOR(it,t) {if(it!=t.begin()) os<<","; os<<*it;} os<<"}"; return os;
}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class S, class T> pair<S,T> operator+(const pair<S,T> &s, const pair<S,T> &t){ return pair<S,T>(s.first+t.first, s.second+t.second);}
template<class S, class T> pair<S,T> operator-(const pair<S,T> &s, const pair<S,T> &t){ return pair<S,T>(s.first-t.first, s.second-t.second);}

const int INF = 1<<28;
const double EPS = 1e-8;
const int MOD = 1000000007;

ll T, n, m;

int main(int argc, char *argv[]){
    ios::sync_with_stdio(false);
    n = 500;
    vector<vector<ll>> m(n + 2, vector<ll>(n + 2, 1));
    set<ll> used;
    ll c = 2;
    for(int i=1;i<=n;i+=2) {
        for(int j=1;j<=n;j+=4) {
            while(used.count(c) + used.count(c * 2)) c++;
            used.insert(c);
            used.insert(c * 2);
            m[i][j] = c;
            m[i+1][j+1] = c*2;
        }
    }
    for(int i=1;i<=n;i+=2) {
        for(int j=3;j<=n;j+=4) {
            while(used.count(c) + used.count(c * 2)) c++;
            used.insert(c);
            used.insert(c * 2);
            m[i][j] = c;
            m[i+1][j+1] = c*2;
        }
    }

    for(int i=1;i<=n;i+=1) {
        for(int j=1;j<=n;j+=1) {
            if (m[i][j] != 1) {
                continue;
            }
            ll x = m[i-1][j] / __gcd(m[i-1][j], m[i+1][j]) * m[i+1][j];
            x = x / __gcd(x, m[i][j-1]) * m[i][j-1];
            x = x / __gcd(x, m[i][j+1]) * m[i][j+1];
            ll y = x;
            while (used.count(y + 1)) y += x;
            m[i][j] = y + 1;
            used.insert(y + 1);
        }
    }

//    assert(used.size() == n * n);
//    ll mx = 0;
//    REPS(i, n)REP(j, n) mx = max(mx, m[i][j]);
//    cerr << "MAX: " << mx << endl;
//    REPS(i, n) {
//        REPS(j, n) {
//            assert(0 < m[i][j] && m[i][j] <= 1000000000000000ll);
//            if (i + 1 <= n) {
//                ll x = max(m[i][j], m[i + 1][j]);
//                ll y = min(m[i][j], m[i + 1][j]);
//                if (x % y != 1) {
//                    cout << i << ", " << j << m[i][j] << ", " << m[i + 1][j] << endl;
//                }
//                assert(x % y == 1);
//            }
//            if (j + 1 <= n) {
//                ll x = max(m[i][j], m[i][j + 1]);
//                ll y = min(m[i][j], m[i][j + 1]);
//                assert(x % y == 1);
//            }
//        }
//    }

    cin >> n;
    REPS(i, n) {
        REPS(j, n) {
            cout << m[i][j] << " \n"[j == n];
        }
    }
    return 0;
}


Measured memory_bytes: 16512