Problem: You are given an integer N.

Construct any one N-by-N matrix a that satisfies the conditions below. It can be proved that a solution always exists under the constraints of this problem.

* 1 \leq a_{i,j} \leq 10^{15}
* a_{i,j} are pairwise distinct integers.
* There exists a positive integer m such that the following holds: Let x and y be two elements of the matrix that are vertically or horizontally adjacent. Then, {\rm max}(x,y) {\rm mod} {\rm min}(x,y) is always m.

Constraints

* 2 \leq N \leq 500

Input

Input is given from Standard Input in the following format:


N


Output

Print your solution in the following format:


a_{1,1} ... a_{1,N}
:
a_{N,1} ... a_{N,N}

Output

Print your solution in the following format:


a_{1,1} ... a_{1,N}
:
a_{N,1} ... a_{N,N}

Example

Input

2


Output

4 7
23 10

Solution (in CPP):

Solution:
#include <bits/stdc++.h>

#define debug(x) cerr<<#x<<'='<<x<<endl
#define set0(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
template<typename T> void read(T &x){
	x = 0;char ch = getchar();ll f = 1;
	while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}
	while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}

ll gcd(ll a,ll b){
	if(b == 0)return a;
	return gcd(b,a%b);
}
ll lcm(ll a,ll b){
	if(a == 0)return b;
	if(b == 0)return a;
	return 1ll*a/gcd(a,b)*b;
}
ll isnp[10010],n;
vector<int> V,tv;
set<int> S;
ll ans[505][505];
int main() {
	read(n);
	int sub = 0;
	if(n%2 == 1){
		n+=1;
		sub+=1;
	}
	int m = n;
	if(m%2 == 0)m+=1;
	for(int i=1;i<=m/2;i++){
		tv.push_back(i);
		tv.push_back(m-i);
	}
	for(int i=2;i<10010;i++){
		if(isnp[i])continue;
		if(i>=m && V.size()<(n+1)/2)V.push_back(i);
		for(int j = i+i;j<10010;j+=i)isnp[j] = 1;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if((i+j)%2 ==0){
				ans[i][j] = tv[j-1]*V[(i-1)/2];
				assert(S.count(ans[i][j]) == 0);
				S.insert(ans[i][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if((i+j)%2 ==1){
				ll cl = lcm(lcm(ans[i-1][j],ans[i+1][j]),lcm(ans[i][j-1],ans[i][j+1]));
				ans[i][j] = cl+1;
				while(S.count(ans[i][j]))ans[i][j]+=cl;
				assert(ans[i][j]<1e15);
				S.insert(ans[i][j]);
			}
		}
	}
	n-=sub;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<ans[i][j]<<"\t";
		}
		cout<<endl;
	}
	return 0;
}