この必要条件が満たされる場合、「文字列の先頭部からiとなる部分文字列が取れ、かつ、文字列の末尾部からkとなる文字列が取れる」ならば、残りの真ん中の部分は必ずjとなる、と分かる。問題は、文字列の先頭部と末尾部を何文字分見ればいいかということ。クオータニオンは16個の状態しか持たないので、なんとなくL*16個分見れば十分な気がしたけど、正当化できていません。ハマったのが、文字列の末尾部を順番に見ていく部分。交換則が成り立たないことを忘れていました。引数の異なるinitializerを二つ持てないらしく、対策に難儀しました。endendmain()以下はC#。Largeファイルダウンロード後に、int型では足りないことに気付いて、提出はぎりぎりでした。OminoX個のブロックからなるX-ominoの集合がある。Gabrielは、指定盤面R*Cを、任意のX-ominoで敷き詰められば勝ち。敷き詰めなければRichardの勝ち。Gabrielは、Richardが選んだX-ominoを必ず使わなければならない。丁寧に場合分け...だと思う。Largeを落としたので後で復習。常套手段として、常にR<=CとなるようにRとCをswapしておくと便利。以下はCで書いたSmallを通過するコード。0;}(追記)Largeのバグを修正したPerlのコードです。短辺=3のときにバグがありました。このときは長辺が8以上のときに盤を埋めるチャンスがあります。8ならチャンスがある。Codeforces。