元ネタ
解説
まず、回転による同一視を行わずに塗り分けを数えることを考えます。 色どうしの隣接条件を表す 行列 を、次のように定義します。
- 色 と色 が隣り合ってよいなら
- 隣り合ってはならないなら
条件 に対しては、 と の両方を にします。 の条件は対角成分を にすることに対応します。
行列の積の定義より、 は、色 から始めて 回隣接する色を選び、最後に色 に到達する方法の個数です。 したがって、長さ の塗り分けで末尾と先頭の隣接条件も満たすものの個数は、
となります。ここでは円周上の点を区別して数えています。 の場合も、同じ色を繰り返して条件を満たす色の個数として、 で数えられます。
回転による同一視にはバーンサイドの補題を使います。 点を時計回りに 個分ずらす回転で不変な塗り分けは、 とすると、長さ のパターンを繰り返すことで得られます。 このパターンも末尾と先頭の隣接条件を満たす必要があるので、不変な塗り分けの個数は です。
として現れる値は の約数です。 のうち を満たすものは、トーシェント関数を用いて 個と数えられます。 よって、求める答えは
です。
を素因数分解して約数を列挙し、各約数について と を計算します。 行列累乗を繰り返し二乗法で行えば、1つの約数あたり で計算できます。 素因数分解を試し割りで行う場合、全体の計算量は です。 ここで は の約数の個数です。
(今回は の制約が小さめなので、 の約数包除などでも答えを求めることができます、実際には がもうちょっと大きめでも解けますが、普通に出すとポラードローを要求することになったり を求めるパートで逆元が存在しなかったり色々不都合が生じるので今の形に…)
計算はすべて を法として行います。 なので、最後の による除算は の逆元を掛けることで行えます。
ちなみに
元の設定は「円周上の点を白黒に塗り分け、黒い点どうしの隣接を禁止し、回転で一致するものを1通りと数える」というものでした。 今回の問題では とし、黒どうしの1ペアだけを禁止した場合に相当します。
この場合、回転による同一視を行わない塗り分けの個数は、フィボナッチ数列 を使って と書けます。 実験すると OEIS の A000358 が出てくるので没に…かなしい。
ユーザー解説
ユーザー解説を書くユーザー解説はまだありません。