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: Accepted)

#include <bits/stdc++.h>

using namespace std;

#define foru(i, l, r) for (register int i = l; i <= r; i++)
#define ford(i, r, l) for (register int i = r; i >= l; i--)

typedef long long ll;
ll gcd(ll x, ll y) { return !y ? x : gcd(y, x % y); }
ll lcm(ll x, ll y) { return x / gcd(x, y) * y; }
ll N, prime[20003], p_cnt, Need, a[505][505];

int main() {
  srand(time(0));
  for (int i = 2; i <= 20000; i++) {
    bool flag = true;
    for (int j = 2; j * j <= i && flag; j++)
      if (i % j == 0) flag = false;
    if (flag) prime[++p_cnt] = i;
  }
  scanf("%lld", &N), Need = N + N - 2;
  if(N == 2) {
    puts("4 7");
    puts("23 10");
    return 0;
  }
  //  random_shuffle(prime + 1, prime + Need + 1);
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (!((i + j) & 1)) continue;
      int x = (i + j) >> 1;
      int y = ((N - (N & 1)) - (j - i) + 1) >> 1;
      a[i][j] = prime[x] * prime[N - 1 + y];
    }
  }
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if ((i + j) & 1) continue;
      a[i][j] = 1;
      if (i > 1) a[i][j] = lcm(a[i][j], a[i - 1][j]);
      if (j > 1) a[i][j] = lcm(a[i][j], a[i][j - 1]);
      if (i < N) a[i][j] = lcm(a[i][j], a[i + 1][j]);
      if (j < N) a[i][j] = lcm(a[i][j], a[i][j + 1]);
      a[i][j]++;
    }
  }
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= N; j++) printf("%lld%c", a[i][j], " \n"[j == N]);
  return 0;
}