Problem:
Score : 1100 points

Problem Statement

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}

Sample Input 1

2

Sample Output 1

4 7
23 10

For any two elements x and y that are vertically or horizontally adjacent, {\rm max}(x,y) {\rm mod} {\rm min}(x,y) is always 3.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define reg register
typedef long long ll;
using namespace std;
const int MN=8000;
int n,pri[1001],cnt,vis[MN+5],id[501][501][2];
ll a[501][501];
inline bool border(int i){return (i==1||i==n);}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);cin>>n;
	for(reg int i=2;i<=MN;i++){
		if(!vis[i])pri[++cnt]=i;
		if(cnt==1000)break;
		for(reg int j=1;j<=cnt&&pri[j]*i<=MN;j++){
			vis[pri[j]*i]=1;
			if(!(i%pri[j]))break;
		}
	}
	for(reg int i=1;i<=n;i++)
		for(reg int j=1;j<=n;j++)
			if((~(i+j))&1){
				id[i][j][0]=(i+j)>>1;
				id[i][j][1]=n+(abs(i-j)>>1)+1;
			}
	for(reg int i=1;i<=n;i++)
		for(reg int j=1;j<=n;j++)
			if((~(i+j))&1){
				a[i][j]=1ll*pri[id[i][j][0]]*pri[id[i][j][1]];
			}
			else{
				if(border(i)&&border(j))
					if(i==1)a[i][j]=1ll*pri[id[2][n][0]]*pri[id[1][n-1][0]]*pri[id[1][n-1][1]];
					else a[i][j]=1ll*pri[id[n][2][0]]*pri[id[n-1][1][0]]*pri[id[n-1][1][1]];
				else if(border(i))
					a[i][j]=1ll*pri[id[i][j-1][0]]*pri[id[i][j+1][0]]*pri[id[i][j-1][1]]*pri[id[i][j+1][1]];
				else a[i][j]=1ll*pri[id[i-1][j][0]]*pri[id[i+1][j][0]]*pri[id[i-1][j][1]]*pri[id[i+1][j][1]];
				a[i][j]++;
			}
	for(reg int i=1;i<=n;i++){
		for(reg int j=1;j<=n;j++)
			cout<<a[i][j]<<' ';
		cout<<endl;
	}
	return 0;
}