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<iostream>
#include<vector>
#include<algorithm>

unsigned long long  a[550][550], c[550][550];
using namespace std;
int main(){
    int n;
    cin >> n;
    for(int i = 0; i <= n+2; i++){for(int j = 0; j <= n+2; j++){a[i][j] = c[i][j] = 1;}}
    
    vector<unsigned long long > primes;
    vector<bool> visited(100000, 0);
    for(int i = 2; i < 10000; i++){
        if(!visited[i]){
            primes.push_back(i);
            for(int j = i; j < 100000; j+= i){
                visited[j] = 1;
            }
        }
    }
    int cnt = 0;
    for(int i = 0 ; i <= n; i+=2){
        a[0][i] = primes[cnt];
        cnt++;
    }
    for(int i = 0; i <= n; i+=2){
        a[i][0] = primes[cnt];
        cnt++;
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            a[i][j] = a[i-1][j-1];
        }
    }
    
    for(int i = n+1; i > 0; i-=2){
        c[0][i] = primes[cnt];
        cnt++;
    }
    for(int i = n+1; i > 0; i-=2){
        c[i][n+1] = primes[cnt];
        cnt++;
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            c[i][j] = c[i-1][j+1];
            a[i][j] *= c[i][j];
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if((i+j)%2){
                a[i][j] = a[i][j-1]*a[i][j+1]*a[i-1][j] * a[i+1][j]  + 1;
            }
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            cout << a[i][j] << " ";
        }
        cout << "\n";
    }
}