#include<cstdio>
typedef long long ll;
const int MAXN = 500;
const int MAXM = 10000;
bool vis[MAXM + 5];
int prm[MAXM + 5], pcnt = 0;
ll GCD(ll x, ll y) {
	return y == 0 ? x : GCD(y, x%y);
}
ll LCM(ll x, ll y) {
	return x / GCD(x, y) * y;
}
void sieve() {
	for(int i=2;i<=MAXM;i++) {
		if( !vis[i] ) prm[++pcnt] = i;
		for(int j=1;i*prm[j]<=MAXM;j++) {
			vis[i*prm[j]] = true;
			if( i % prm[j] == 0 ) break;
		}
	}
}
ll Mat[MAXN + 5][MAXN + 5];
int main() {
	sieve(); int N;
	scanf("%d", &N);
	if( N == 2 ) {
		printf("4 7\n23 10\n");
		return 0;
	}
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			Mat[i][j] = 1;
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			if( (i & 1) == (j & 1) ) {
				Mat[i][j] = prm[(i + j) / 2] * prm[(i+N+1-j)/2 + N];
				Mat[i+1][j] = LCM(Mat[i+1][j], Mat[i][j]);
				Mat[i-1][j] = LCM(Mat[i-1][j], Mat[i][j]);
				Mat[i][j+1] = LCM(Mat[i][j+1], Mat[i][j]);
				Mat[i][j-1] = LCM(Mat[i][j-1], Mat[i][j]);
			}
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			if( (i & 1) != (j & 1) )
				Mat[i][j]++;
	for(int i=1;i<=N;i++) {
		for(int j=1;j<N;j++)
			printf("%lld ", Mat[i][j]);
		printf("%lld\n", Mat[i][N]);
	}
}