AtCoder Grand Contest 016C: +/- Rectangle

http://agc016.contest.atcoder.jp/submissions/1365887
まあわかれば大したことないんだけど。

Hがhで割れて、Wがwで割れる時、h*wの長方形を左上から詰めていくと(H/h)*(W/w)個の長方形がきれいに収まる。
これらの長方形内のh*w個の数の和は負なのでH*W全体でも負の値になり不可。

HとWどちらかが割れないとき、
h*wの長方形の左上の数を114514*810
h*wの長方形の右下の数を-114514*810-1
それ以外は0を入れる
とすると、h*wの長方形を詰めていったとき、収まらなかった端の部分に114514*810が一つ以上必ず含まれ、-114514*810-1は含まれない。よってH*W全体の和は114514*810-500*500より大きくなるので条件を満たす。

int N, M, H, W;
const int yajue = 114514 * 810;

void solve() {
	cin >> N >> M >> H >> W;
	if(N % H == 0 && M % W == 0) cout << "No\n";
	else {
		cout << "Yes\n";
		rep(i, 0, N) {
			rep(j, 0, M) {
				if(i % H == 0 && j % W == 0) cout << yajue << " ";
				else if(i % H == H - 1 && j % W == W - 1) cout << -yajue - 1 << " ";
				else cout << 0 << " ";
			}
			cout << "\n";
		}
	}
}

もうちょっとパパっと思いつくといいね。