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;
int gcd(int f , int 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;
ll arr[521][512];
map<ll , bool> vis;
int main() {
	
	int n;
	cin >> n;
	int counter = 2 ;
	for(int i=0 ; i< n ; i++){
		for(int j=0 ; j< n ; j++){
			if((i + j)%2== 0){
				vis[counter] = 1;
				arr[i][j]=counter++;
			}
		}
	}	
	for(int i=0 ; i< n ; i++){
		for(int j=0 ; j< n ; j++){
			if((i + j)%2== 1){
				ll num = 1 , g = -1;
				if(i != 0){
					g = arr[i-1][j];
					num = arr[i-1][j];
				}
				if(i != n-1){
					if(g != -1)
						g = gcd(g , arr[i+1][j]);
					else g = arr[i+1][j];
					num *= arr[i+1][j];
				}
				if(j != 0){
					if(g != -1)
						g = gcd(g , arr[i][j-1]);
					else g = arr[i][j-1];
					num *= arr[i][j-1];
				}
				if(j != n-1){
					if(g != -1)
						g = gcd(g , arr[i][j+1]);
					else g = arr[i][j+1];
					num *= arr[i][j+1];
				}
				ll lol = num / g + 1;
				while(vis[lol] != 0){
					lol *= lol;
				}
				vis[lol] = 1;
				arr[i][j] = lol;
			}
		}
	}
	for(int i=0 ; i< n ; i++){
		for(int j=0 ; j< n ; j++){
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
	return 0;	
}