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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<math.h>
double gcm(double a, double b)
{
    double r = fmod(a, b);
    while (r != 0)
    {
        a = b;
        b = r;
        r = fmod(a, b);
    }
    return b;
}
double max(double a, double b)
{
    if (a > b)
        return a;
    else
        return b;
}
double min(double a, double b)
{
    if (a < b)
        return a;
    else
        return b;
}
int main()
{
    int n;
    scanf("%d", &n);
    int i, j, k, l;
    double x;
    int p;
    double a[502][502];
    double g;
    for (i = 0; i < n; i++)
        a[0][i] = i + 2;
    for (i = 1; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (j == 0)
            {
                x = n;
                for (;;)
                {
                    p = 0;
                    if (fmod(max(a[i - 1][0], x), min(a[i - 1][0], x)) == 1)
                    {
                        for (k = 0; k < i; k++)
                        {
                            for (l = 0; l < n; l++)
                            {
                                if (a[k][l] == x)
                                {
                                    x += 2;
                                    p++;
                                    break;
                                }
                            }
                            if (p > 0)
                                break;
                        }
                        if (p == 0)
                        {
                            a[i][j] = x;
                            break;
                        }
                    }
                    else
                        x++;
                }
            }
            else
            {
                g = gcm(a[i][j - 1], a[i - 1][j]);
                g = a[i][j - 1] * a[i - 1][j] / g;
                x = g + 1;
                p = 0;
                for (;;)
                {
                    for (k = 0; k < i; k++)
                    {
                        for (l = 0; l < n; l++)
                        {
                            if (a[k][l] == x)
                            {
                                x += g;
                                p++;
                                break;
                            }
                        }
                        if (p > 0)
                            break;
                    }
                    if (p == 0)
                    {
                        a[i][j] = x;
                        break;
                    }

                }
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        printf("%.0lf", a[i][0]);
        for (j = 1; j < n; j++)
            printf(" %.0lf", a[i][j]);
        printf("\n");
    }
    return 0;
}