kmjp's blog

競技プログラミング参加記です

AtCoder ARC #140 : E - Not Equal Rectangle

うーん、近いところまで行ったのに。
https://atcoder.jp/contests/arc140/tasks/arc140_e

問題

H*Wのグリッドの各マスに、1~25の値を埋めることを考える。
軸に平行な矩形領域を取ったとき、四つ角にある値がすべて一致するようなものが1つも存在しないように値を埋めよ。
H,Wは500以下とする。

解法

最大ケースで条件を満たせば、より小さいケースでも条件を満たす。
よって最大ケースだけ考えればよい。

25以下で最大の素数P=23を使い、r行c列の値A[r][c]を以下のようにしよう。
A[r][c] = (floor(r/P)*floor(c/P)+r+c)%P + 1

int H,W;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	
	cin>>H>>W;
	int p=23;
	FOR(y,H) {
		FOR(x,W) {
			r=((x/p)*(y/p)+x+y)%p;
			cout<<r+1<<" ";
		}
		cout<<endl;
	}
}

まとめ

25や500という整数に引っ張られる問題。