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: Wrong Answer)

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Text;

public class Program
{

    public void Proc()
    {
        int[] inpt = Reader.ReadLine().Split(' ').Select(a => int.Parse(a)).ToArray();
        if(inpt[0]%inpt[2]==0&&inpt[1]%inpt[3]==0) {
            Console.WriteLine("No");
            return;
        }
        Nullable<long>[,] map = new Nullable<long>[inpt[0], inpt[1]];
        Nullable<long>[,] subtotal = new Nullable<long>[inpt[0], inpt[1]];
        for (int i = 0; i < inpt[0]; i++) {
            for (int j = 0; j < inpt[1]; j++) {
                long sub = 0;
                if(i>0) {
                    sub += subtotal[i - 1, j].Value;
                }
                if(j>0) {
                    sub += subtotal[i, j - 1].Value;
                }
                if(i>0&&j>0) {
                    sub -= subtotal[i - 1, j - 1].Value;
                }
                if((i+1)%inpt[2]==0&&(j+1)%inpt[3]==0) {
                    map[i, j] = inpt[2] * inpt[3] * -1;
                    subtotal[i, j] = sub + map[i, j].Value;
                } else {
                    map[i, j] = 1;
                    subtotal[i, j] = sub + 1;
                }
            }
        }

        StringBuilder ans = new StringBuilder();
        if(subtotal[inpt[0]-1, inpt[1]-1].Value <= 0) {
            Console.WriteLine("No");
            return;
        } 
		ans.AppendLine("Yes");
		for (int i = 0; i < map.GetLength(0); i++)
		{
			for (int j = 0; j < map.GetLength(1); j++)
			{
				if (j > 0)
				{
					ans.Append(" ");
				}
				ans.Append(map[i, j].Value);
			}
			ans.AppendLine(string.Empty);
		}
        Console.Write(ans.ToString());
    }



    public class Reader
	{
		private static StringReader sr;
		public static bool IsDebug = false;
		public static string ReadLine()
		{
			if (IsDebug)
			{
				if (sr == null)
				{
					sr = new StringReader(InputText.Trim());
				}
				return sr.ReadLine();
			}
			else
			{
				return Console.ReadLine();
			}
		}
		private static string InputText = @"



5 5 1 3


";
	}

	public static void Main(string[] args)
	{
#if DEBUG
		Reader.IsDebug = true;
#endif
		Program prg = new Program();
		prg.Proc();
	}
}