問題一覧 > 通常問題

No.3741 Used to be Polyominal Constructive

レベル : / 実行時間制限 : 1ケース 10.000秒 / メモリ制限 : 1024 MB / スペシャルジャッジ問題 (複数の解が存在する可能性があります)
タグ : (解説公開後に AC するまで非表示) / 解いたユーザー数 4
作問者 : 👑 kencho / テスター : uruzunyaa
お気に入りにしたユーザー ProblemId : 13820 / 自分の提出
問題文最終更新日: 2026-09-11 01:47:07
グリッド構築24題 (順位表) の他の問題:

ストーリー

kencho君は次のような問題を考えました。

「$N \times N$ のグリッドに収まるようなポリオミノが $3$ つ与えられるため、各ポリオミノを平行移動して、どの $2$ つのポリオミノについても重ならず辺を共有して隣接させる方法の一例を出力せよ」



この問題は一見面白そうでしたが、愚直に近い解を SIMD により高速化することで、想定解より高速になってしまうことが判明しました(時間のある方は $O(N^2 \log N)$ 解法を考えてみてください)。

そこで、kencho君は出題形式を変更し、「ポリオミノ同士をランダムに隣接させて整合する組み合わせを探索するような嘘解法」を落とせるテストケースを作成してもらうことにしました。

ちなみに、polyominal という語は論文等において若干の使用例はあるもののほぼ使われておらず、polyomino をそのまま名詞修飾に使うのが一般的だそうです。

問題文

各マスに # または . が書かれた $N \times N$ のグリッドを考えます。グリッド $G$ の # が書かれたマスを単位正方形とみなしたとき、それらの集合を $G$ が表す図形 と呼びます。

図形が空でなく、辺を共有する単位正方形をたどって任意の単位正方形から他の任意の単位正方形へ移動できるとき、その図形を ポリオミノ と呼びます。

以下の条件を全て満たすような、整数 $N$ 及び $3$ 個の $N \times N$ グリッド $(G_1, G_2, G_3)$ を求めてください。$G_i$ が表す図形を $P_i$ とします。

  • $N$ は $1$ 以上 $666$ 以下の整数
  • $i = 1, 2, 3$ について、$P_i$ はポリオミノ
  • 平行移動によって $P_1$ と $P_2$ を隣接させる方法の数は $10^5$ 通り以上
  • 平行移動によって $P_2$ と $P_3$ を隣接させる方法の数は $10^5$ 通り以上
  • 平行移動によって $P_3$ と $P_1$ を隣接させる方法の数は $10^5$ 通り以上
  • 平行移動によって $P_1$ と $P_2$、$P_2$ と $P_3$、$P_3$ と $P_1$ を同時に隣接させる方法の数は $1$ 通り以上 $10$ 通り以下
隣接させる方法の数とは

この問題では、ポリオミノを回転・反転させず、整数ベクトルだけ平行移動させることを考えます。

平行移動は無限に広がる正方格子上で行い、移動後の図形が元の $N \times N$ グリッド内に収まる必要はありません。

2 個のポリオミノが、次の条件をともに満たすとき、これらは 隣接している といいます。

  • 2 個のポリオミノの単位正方形が重なっていない。
  • 一方のポリオミノの単位正方形と、もう一方のポリオミノの単位正方形で、辺を共有するものが存在する(頂点を共有するだけでは隣接とはみなしません)。

$P_i$ と $P_j$ を隣接させる方法の数とは、$P_i$ の位置を固定し、$P_j$ を整数ベクトルだけ平行移動させたときに、2 個のポリオミノが隣接するような平行移動ベクトルの個数です。共有する辺が複数あっても、平行移動ベクトルが同じなら $1$ 通りとします。

$P_1$ と $P_2$、$P_2$ と $P_3$、$P_3$ と $P_1$ を同時に隣接させる方法の数とは、$P_1$ の位置を固定し、$P_2, P_3$ をそれぞれ整数ベクトル $v_2, v_3$ だけ平行移動させたときに、3 組全てが隣接するような順序付き組 $(v_2, v_3)$ の個数です。

したがって、全てのポリオミノを同じだけ平行移動させただけの配置は、別の方法として数えません。

入力

この問題は output-only です。入力は与えられません。

出力

以下の形式で整数 $N$ 及びグリッド $G_1, G_2, G_3$ を出力してください。

$N$
$G_{1, 1, 1} G_{1, 1, 2} \ldots G_{1, 1, N}$
$G_{1, 2, 1} G_{1, 2, 2} \ldots G_{1, 2, N}$
$\vdots$
$G_{1, N, 1} G_{1, N, 2} \ldots G_{1, N, N}$
$G_{2, 1, 1} G_{2, 1, 2} \ldots G_{2, 1, N}$
$G_{2, 2, 1} G_{2, 2, 2} \ldots G_{2, 2, N}$
$\vdots$
$G_{2, N, 1} G_{2, N, 2} \ldots G_{2, N, N}$
$G_{3, 1, 1} G_{3, 1, 2} \ldots G_{3, 1, N}$
$G_{3, 2, 1} G_{3, 2, 2} \ldots G_{3, 2, N}$
$\vdots$
$G_{3, N, 1} G_{3, N, 2} \ldots G_{3, N, N}$

$G_{i,j,k}$ は、グリッド $G_i$ の上から $j$ 行目、左から $k$ 列目のマスに書かれた文字を表します。

最後に改行してください。

ビジュアライザ

出力結果のWeb版ビジュアライザがこちらで提供されています。

コンテスト中における、ビジュアライズ結果の共有や解法・考察に関する言及は禁止されています。ご注意下さい。

また、ビジュアライザの仕様に関する質問は原則受け付けません。あくまで補助ツールとしてご利用ください。

サンプル

出力
2
#.
##
.#
.#
##
##

このサンプル出力は出力形式を表すものであり、提出した場合 WA と判定されることに注意してください。

この出力が表す $P_1, P_2, P_3$ について、それぞれの方法の数は以下の通りです。

  • 平行移動によって $P_1$ と $P_2$ を隣接させる方法の数は $9$ 通り


  • 平行移動によって $P_2$ と $P_3$ を隣接させる方法の数は $10$ 通り


  • 平行移動によって $P_3$ と $P_1$ を隣接させる方法の数は $11$ 通り


  • 平行移動によって $P_1$ と $P_2$、$P_2$ と $P_3$、$P_3$ と $P_1$ を同時に隣接させる方法の数は $17$ 通り

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。