公式解説と本質的には変わらないだろうが、数学初心者の競プロerなりに考えた方法を書き留めておく。私はこちらの方が考えやすかった。
A
と B
を 0
に、C
を 1
に置き換えた文字列を考える。たとえば、ACBAC
は 01001
となる。定義より、0
が隣り合うことがあっても、1
が隣り合うことはない。
このようにしたとき、操作は以下のように置き換えられる。
0
と 1
の間には、0
を挿入する。1
と 0
の間には、0
を挿入する。0
と 0
の間には、1
を挿入する。以下のようなDPを考える。
00
に 回操作を行ったときの、1
の個数01
または 10
に 回操作を行ったときの、1
の個数明らかに、 である。
また、 のとき、DPの値は以下のようになる。
00
に 回操作すると 010
になるので、01
と 10
に対して 回操作を行うことになる。真ん中に挿入した 1
が重複して数えられることに留意。01
に 回操作すると 001
になるので、 00
と 01
に対して 回操作を行うことになる。10
の場合でもほぼ同様。DPの様子をある程度手計算してみることにする。
こう見ると、 が奇数のとき になりそうである。これを帰納法で証明しておこう。(なお本番中は証明していない)
重要なのは と である。以降、 とする。
基本的に 1
の数は になりそうだが、これらは両端以外の文字を重複して数えているため、その数だけ引かれることになる。
1
の個数の最大化を考えると、明らかに 文字目から 文字目はすべて 0
にするのがよいことになる。 文字目と 文字目はどちらでもよいので、結局以下の 通りになる。
00000...00000
10000...00000
00000...00001
10000...00001
これらに対応する文字列は各 通りである (最も左の 0
を A
と B
のどちらにするかを決めると、その他も一意に定まる) から、 である。
また、 である。
1
の個数の最小化を考えると、 文字目から 文字目の 1
の個数を最大化すればよいことになる。この区間の長さは奇数なので、01010...01010
のみに対応する。
0
の個数は であり、すべての 0
を独立に A
または B
に対応させることができるので、これに対応する文字列は 通りである。よって、 である。
また、1
の個数は 個なので、 である。
が求まったので、あとは を求めれば、 が求まり問題が解ける。
先ほどのDPテーブルの、奇数のところだけを取り出したものを考える。そして、それらを 進数表記してみる。(だいたい倍々に増えているので規則性がありそうと踏んでいる)
の 進数表記 | ||
---|---|---|
こうしてみると、どんどん が増えてきそうな気持ちになる。試しに などを計算してみるとなおさら正しそうである。実際、これは以下のように証明できる。(なおこれも本番中は証明していない)
より、 進数表記では末尾の を にして を付け加えるといえる。
こうすると、 と表すことができる。よって、 となる。
これらの値を で割った余りを求めよう。以降、 を省略する。
Fermatの小定理より、
これらより、答えは