競プロキャンプ2026関西
コンテスト日時
2026/10/17 (Sa) 15:30 - 17:30

M - Rotate 2x2

Earlgray
2
s
1024
MB
100
点

問題文

., # からなる長さ $W$ の文字列 $S_1,S_2,\ldots ,S_H$ が与えられます。$S_i$ の $j$ 番目の文字を $S_{i,j}$ で表します。

$H$ 行 $W$ 列のマス目があります。上から $i$ 行目、左から $j$ 列目のマスをマス $(i,j)$ と呼ぶことにします。各マス $(i,j)$ について、そのマスには整数 $(i-1)\times W + j$ が書かれたチップが $1$ つ置かれています。以降、あなたは次の手順からなる操作を $0$ 回以上の好きな回数行えます。

  1. 以下の条件をすべて満たす整数の組 $(i,j)$ を選ぶ。
    • $1 \leq i \leq H-1$
    • $1 \leq j \leq W-1$
    • $S_{i,j}=S_{i,j+1}=S_{i+1,j}=S_{i+1,j+1}=$.
  2. 選んだ $(i,j)$ を左上とする $2 \times 2$ の部分にある $4$ つのチップを、時計回りに $90$ 度回転するように移動する。正確には、次の $4$ つの移動を同時に行う。
    • マス $(i,j)$ にあるチップをマス $(i,j+1)$ に移動する。
    • マス $(i,j+1)$ にあるチップをマス $(i+1,j+1)$ に移動する。
    • マス $(i+1,j+1)$ にあるチップをマス $(i+1,j)$ に移動する。
    • マス $(i+1,j)$ にあるチップをマス $(i,j)$ に移動する。

最終的なマス目の状態としてありうるものの個数を $998244353$ で割った余りを計算してください。ただし、 $2$ つのマス目の状態が異なるとされるのは、あるマス $(i,j)$ に置かれているチップに書かれている整数の値が異なる場合です。

ツール

ビジュアライザを以下のURLで公開しています。
https://brief.mathenachia.blog/media/kyoprocamp2026west/91vle46cg2t4slx0.html

制約

  • $2 \leq H \leq 500$
  • $2 \leq W \leq 500$
  • $H$ 、 $W$ は整数
  • $S_i$ は ., # からなる長さ $W$ の文字列

部分点

  • $H = 2$ を満たすデータセットに正解した場合は $50$ 点が与えられる。

入力

入力は以下の形式で標準入力から与えられる。

$H$ $W$
$S _ 1$
$S _ 2$
$\vdots$
$S _ H$

出力

答えを $1$ 行で出力せよ。

入力例 1
4 4 #### #..# #..# ####
出力例 1
4

中央の $4$ つのチップ(それぞれ $6,7,10,11$ が書かれたチップ)を移動させる操作のみ行えます。
$4$ 回操作すると元に戻るので、最終的な状態としてあり得るものは $4$ 通りあります。

入力例 2
3 4 .#.# #... ..#.
出力例 2
1

どのチップも移動できません。あり得る最終状態は、初期状態と同じもののみの $1$ 通りです。

入力例 3
7 55 .#...#.####...####.####..####...###...####..###..#...#. .#...#.#...#.#.....#...#.#...#.#...#.#.....#...#.##..#. .#...#.#...#.#.....#...#.#...#.#...#.#.....#...#.#.#.#. .#...#.####..#.....####..####..#...#.#.....#...#.#..##. ..#.#..#.#...#.....#.....#.#...#...#.#.....#...#.#...#. ..#.#..#..#..#.....#.....#..#..#...#.#.....#...#.#...#. ...#...#...#..####.#.....#...#..###...####..###..#...#.
出力例 3
957485951

$998244353$ で割ったあまりを答えることに注意してください。

入力例 4
13 59 ........................................................... #...#.#...#..###..####..####...###...####..###..#...#.####. #..#...#.#..#...#.#...#.#...#.#...#.#.....#...#.##.##.#...# ###.....#...#...#.####..####..#...#.#.....#####.#.#.#.####. #..#....#...#...#.#.....#..#..#...#.#.....#...#.#...#.#.... #...#...#....###..#.....#...#..###...####.#...#.#...#.#.... ........................................................... .......###...###...###...###..#...#.#####..####.#####...... ......#...#.#..##.#...#.#.....#.#.#.#.....#.......#........ .........#..#.#.#....#..####..#.#.#.####...###....#........ .......##...##..#..##...#...#.#.#.#.#.........#...#........ ......#####..###..#####..###...#.#..#####.####....#........ ...........................................................
出力例 4
991896486
提出
C++23 (g++ 12.2.0)