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"; } } }
もうちょっとパパっと思いつくといいね。