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>
using namespace std;
#define mp make_pair
#define pb push_back
typedef  long long ll;
ll gcd(ll f , ll s){if(s==0)return f;else return gcd(s,f%s);}
int const N = 1000006;
ll const M = 998244353;
long double const ep = .000000000000000001;
int p[N];
queue<int>q;
ll Farray[1032][1032] , Sarray[1032][1023] , arr[1002][1003];
int main() {
	
	int n;cin >> n;
	for(int i = 2 ; i <= 1000 ; i++){
		if(!p[i]){
			for(int x = i + i; x <= 100000 ; x+=i)p[x] = 1;
		}
	}	
	for(int i = 2 ; i <= 100000 ; i++)if(!p[i])q.push(i);
	pair<int,int>start = mp(0,0);
	for(pair<int,int> i = start ; i.first < n ; i.first += 2){
		int currP = q.front();
		q.pop();
		for(pair<int,int> x = i ; x.first < n && x.second < n ; x.first++ , x.second++){
			Farray[x.first][x.second] = currP;
		}
	}
	for(pair<int,int> i = mp(0,2) ; i.second < n ; i.second += 2){
		int currP = q.front();
		q.pop();
		for(pair<int,int> x = i ; x.first < n && x.second < n ; x.first++ , x.second++){
			Farray[x.first][x.second] = currP;
		}
	}
	
	for(pair<int,int> i = start ; i.second < n ; i.second += 2){
		int currP = q.front();
		q.pop();
		for(pair<int,int> x = i ; x.first < n && x.second >= 0 ; x.first++ , x.second--){
			Sarray[x.first][x.second] = currP;
		}
	}

	for(pair<int,int> i = mp(1+(n%2),n-1) ; i.first < n ; i.first += 2){
		int currP = q.front();
		q.pop();
		for(pair<int,int> x = i ; x.first < n && x.second >= 0 ; x.first++ , x.second--){
			Sarray[x.first][x.second] = currP;
		}
	}


	for(int i = 0 ; i < n ; i++)
		for(int x = 0 ; x < n ; x++)
			arr[i][x] = Farray[i][x] * Sarray[i][x];
	for(int i=0 ; i< n ; i++){
		for(int j=0 ; j< n ; j++){
			if((i + j)%2== 1){
				set<ll>s;
				if(i != 0){
					s.insert(Farray[i-1][j]);
					s.insert(Sarray[i-1][j]);
				}
				if(i != n-1){
					s.insert(Sarray[i+1][j]);
					s.insert(Sarray[i+1][j]);
				}
				if(j != 0){
					s.insert(Sarray[i][j-1]);
					s.insert(Sarray[i][j-1]);
				}
				if(j != n-1){
					s.insert(Sarray[i][j+1]);
					s.insert(Sarray[i][j+1]);
				}
				arr[i][j] = 1;
				set<ll>::iterator it = s.begin();
				for(;it!=s.end() ; it++)arr[i][j]*= *(it);
			}
		}
	}
	for(int i=0 ; i< n ; i++){
		for(int j=0 ; j< n ; j++){
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
	return 0;	
}