難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Simple Counting Problem, but Circular

作成者 seekworser

難易度(作成者設定) Lv.6

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

元ネタ

日能研 電車広告 2026年9月掲載(麻布中学校、算数)

解説

まず、回転による同一視を行わずに塗り分けを数えることを考えます。 色どうしの隣接条件を表す K×KK \times K 行列 AA を、次のように定義します。

  • 色 ii と色 jj が隣り合ってよいなら Ai,j=1A_{i,j}=1
  • 隣り合ってはならないなら Ai,j=0A_{i,j}=0

条件 (xi,yi)(x_i,y_i) に対しては、Axi,yiA_{x_i,y_i} と Ayi,xiA_{y_i,x_i} の両方を 00 にします。 xi=yix_i=y_i の条件は対角成分を 00 にすることに対応します。

行列の積の定義より、(Ad)i,j(A^d)_{i,j} は、色 ii から始めて dd 回隣接する色を選び、最後に色 jj に到達する方法の個数です。 したがって、長さ dd の塗り分けで末尾と先頭の隣接条件も満たすものの個数は、

tr⁡(Ad)=∑i=1K(Ad)i,i\operatorname{tr}(A^d)=\sum_{i=1}^{K}(A^d)_{i,i}

となります。ここでは円周上の点を区別して数えています。 d=1d=1 の場合も、同じ色を繰り返して条件を満たす色の個数として、tr⁡(A)\operatorname{tr}(A) で数えられます。

回転による同一視にはバーンサイドの補題を使います。 点を時計回りに rr 個分ずらす回転で不変な塗り分けは、d=gcd⁡(N,r)d=\gcd(N,r) とすると、長さ dd のパターンを繰り返すことで得られます。 このパターンも末尾と先頭の隣接条件を満たす必要があるので、不変な塗り分けの個数は tr⁡(Ad)\operatorname{tr}(A^d) です。

dd として現れる値は NN の約数です。 0≤r<N0\leq r<N のうち gcd⁡(N,r)=d\gcd(N,r)=d を満たすものは、トーシェント関数を用いて φ(N/d)\varphi(N/d) 個と数えられます。 よって、求める答えは

1N∑d∣Nφ(N/d)tr⁡(Ad)\frac{1}{N}\sum_{d\mid N}\varphi(N/d)\operatorname{tr}(A^d)

です。

NN を素因数分解して約数を列挙し、各約数について φ(N/d)\varphi(N/d) と AdA^d を計算します。 行列累乗を繰り返し二乗法で行えば、1つの約数あたり O(K3log⁡N)O(K^3\log N) で計算できます。 素因数分解を試し割りで行う場合、全体の計算量は O(N+τ(N)K3log⁡N)O(\sqrt N+\tau(N)K^3\log N) です。 ここで τ(N)\tau(N) は NN の約数の個数です。

(今回は NN の制約が小さめなので、 O(τ2(N))O(\tau^2 (N)) の約数包除などでも答えを求めることができます、実際には NN がもうちょっと大きめでも解けますが、普通に出すとポラードローを要求することになったり 1N\frac1N を求めるパートで逆元が存在しなかったり色々不都合が生じるので今の形に…)

計算はすべて 10000000071000000007 を法として行います。 N≤109<1000000007N\leq 10^9<1000000007 なので、最後の NN による除算は NN の逆元を掛けることで行えます。

ちなみに

元の設定は「円周上の点を白黒に塗り分け、黒い点どうしの隣接を禁止し、回転で一致するものを1通りと数える」というものでした。 今回の問題では K=2K=2 とし、黒どうしの1ペアだけを禁止した場合に相当します。

この場合、回転による同一視を行わない塗り分けの個数は、フィボナッチ数列 F0=0,F1=1F_0=0, F_1=1 を使って Fd−1+Fd+1F_{d-1}+F_{d+1} と書けます。 実験すると OEIS の A000358 が出てくるので没に…かなしい。

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。