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

/*
cat <<EOF >mistaken-paste
*/

#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>

#define BIG 2000000007
#define VERYBIG 200000000000007LL

#define MOD 1000000007
typedef uint64_t ull;
typedef  int64_t sll;

#define N_MAX 1000
#define M_MAX 400

typedef struct {
	int32_t a;
	int32_t b;
} hw;

typedef struct {
	sll a;
	sll b;
} hwll;

typedef struct {
	hwll a;
	hwll b;
} linell;


typedef struct {
	ull s;
	ull t;
	int32_t c;
} struct_a;

typedef struct {
	int32_t from;
	int32_t to;
	sll cost;
} struct_b;


ull n, m;
ull h, w;
ull k;
ull q;
ull vua, vub, vuc, vud, vue, vuf;
sll vsa, vsb, vsc, vsd, vse, vsf;
long double vra, vrb, vrc;
double vda, vdb, vdc;
size_t slen;
size_t tlen;
char ch, dh;


ull solve () {
	sll i, j, ki, l;

	ull minors = (h / vua) * (w / vub);
	// when the way works successfully?
	// (h*w - minors) * X > minors * ((a*b - 1) * X + 1)
	// hwX - mX > m(abX - X + 1)
	// hwX > m(abX + 1)
	// hwX - mabX > m
	// (hw - mab)X > m
	ull hw_mab = h * w - minors * vua * vub;
	// if this is 0, it means "vua | h, vub | w"
	// ---> whole space will be filled with MINOR blocks without any gaps
	// ---> Oops total sum is minor

	if (hw_mab == 0) goto fail;
	
	ull generalnum = (minors + hw_mab) / hw_mab;
	ull minornum = ((vua * vub - 1) * generalnum + 1);

	puts("Yes");
	for (i = 0; i < h; i++) {
		for (j = 0; j < w; j++) {
			char split = ((j == (w - 1)) ? '\n' : ' ');
			if (!((i + 1) % vua) && !((j + 1) % vub)) {
				printf("-%llu%c", minornum, split);
			} else {
				printf("%llu%c", generalnum, split);
			}
		}
	}

	return 0;

	fail:
	puts("No");
	return 1;
}

int32_t main (void) {
	int32_t i, j;
	int32_t x, y;

	scanf("%llu%llu", &h, &w);
	scanf("%llu%llu", &vua, &vub, &vuc, &vud, &vue);

	solve();

	return 0;
}