AtCoder GC023 B: Find Symmetries
問題
https://agc023.contest.atcoder.jp/tasks/agc023_b
解法
まず、初期状態で「よい盤面」なものについて考える。
例えば、N=3の場合、以下のような盤面が「よい盤面」である。
a b c b d e c e f
これを右方向に1、下方向に1ずらすと
f c e c a b e b d
となり、これも「よい盤面」となる。さらに右方向に1、下方向に1ずらしても同じである。
つまり、「よい盤面」を横方向と縦方向に同じだけずらしたものは同様に「よい盤面」となる。
よって、整数A、Bの組み合わせのうち、Bを0に固定し、Aのみ0〜N-1に変えて「よい盤面」になる数を数えて、その結果をN倍すれば解となる。
計算量は「よい状態」かどうかのチェックにO(N2)かかるため、全体ではO(N3)となるが、Nは最大300なので一応間に合う。
実装
n = gets.chomp.to_i s = [] n.times do s << gets.chomp end st = s.transpose ans = 0 n.times do ans += 1 if s == st n.times {|i| st[i].rotate!} s.rotate! end ans *= n puts ans