Problem:
Score : 700 points

Problem Statement

You are given four integers: H, W, h and w (1 ≤ h ≤ H, 1 ≤ w ≤ W).
Determine whether there exists a matrix such that all of the following conditions are held, and construct one such matrix if the answer is positive:

The matrix has H rows and W columns.

Each element of the matrix is an integer between -10^9 and 10^9 (inclusive).

The sum of all the elements of the matrix is positive.

The sum of all the elements within every subrectangle with h rows and w columns in the matrix is negative.

Constraints

1 ≤ h ≤ H ≤ 500

1 ≤ w ≤ W ≤ 500

Input

Input is given from Standard Input in the following format:

H W h w

Output

If there does not exist a matrix that satisfies all of the conditions, print No.

Otherwise, print Yes in the first line, and print a matrix in the subsequent lines in the following format:

a_{11} ... a_{1W}
:
a_{H1} ... a_{HW}

Here, a_{ij} represents the (i,\ j) element of the matrix.

Sample Input 1

3 3 2 2

Sample Output 1

Yes
1 1 1
1 -4 1
1 1 1

The sum of all the elements of this matrix is 4, which is positive.
Also, in this matrix, there are four subrectangles with 2 rows and 2 columns as shown below. For each of them, the sum of all the elements inside is -1, which is negative.

Sample Input 2

2 4 1 2

Sample Output 2

No

Sample Input 3

3 4 2 3

Sample Output 3

Yes
2 -5 8 7
3 -5 -4 -5
2 1 -1 7

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.IO;
using System.Linq;
class Z { static void Main() { new K(); } }
class K
{
	public K()
	{
		Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false });
		Solve();
		Console.Out.Flush();
	}
	void Solve()
	{
		var I = Console.ReadLine().Split().Select(int.Parse).ToArray();
		int H = I[0], W = I[1];
		var t = YesNo(H, W, I[2], I[3]);
		if (t == null) Console.WriteLine("No");
		else
		{
			Console.WriteLine("Yes");
			for (var h = 0; h < H; h++)
			{
				for (var w = 0; w < W; w++) Console.Write("{0}{1}", t[h, w], w == W - 1 ? "" : " ");
				Console.WriteLine();
			}
		}
	}
	int[,] Swap2(int[,] t)
	{
		var Y = t.GetLength(0);
		var X = t.GetLength(1);
		var t2 = new int[X, Y];
		for (var x = 0; x < X; x++) for (var y = 0; y < Y; y++) t2[x, y] = t[y, x];
		return t2;
	}
	int[,] YesNo(int H, int W, int h, int w)
	{
		if (H % h == 0 && W % w == 0) return null;
		if (H % h == 0) return Swap2(YesNo(W, H, w, h));
		var r = H % h;
		var s = h - r;
		var N = H / h;
		var a = s * (2 * N + 1);
		var b = 2 * r * (N + 1);
		var x = s * (N + 1);
		var t = new int[H, W];
		for (var y = 0; y < W; y++)
		{
			for (var i = 0; i < N; i++)
			{
				for (var j = 0; j < r; j++) t[i * h + j, y] = a;
				for (var j = r; j < h; j++) t[i * h + j, y] = -b;
			}
			for (var i = N * h; i < H; i++) t[i, y] = x;
		}
		return t;
	}
}