Day 037-Q2 — Burnside補題 / Pólya計数定理(二面体群 D_n 彩色)

2026-05-20 赤色 Master / Phase 8+ ★★★★★★★★★ 群論・数え上げ

問題

$N$ マスを円環状に並べ各マスを $K$ 色で塗る。回転 $N$ 種+反転 $N$ 種(二面体群 $D_n$, $|G|=2N$)で同一視するとき、相異なる塗り方を $10^9+7$ で。

制約

$1 \le N \le 10^9$
$1 \le K \le 10^9$
$\sigma_0(N) \le 1344$(HCN 上限)
時間制限: 2sec

入出力例

入力例 1

4 2

出力例 1

6

入力例 2

6 3

出力例 2

92

概念図: 二面体群 $D_4$ の作用

4 頂点正方形での回転(4 種)と反転(4 種)。それぞれの固定点数を Burnside で平均化。

r^0 (恒等) 固定: K^4 = 16 r (90°回転) 固定: K^gcd(4,1)=K^1=2 2頂点軸 反転 固定: K^(N/2+1)=K^3=8 辺中点軸 反転 固定: K^(N/2)=K^2=4 Burnside: |Orbits| = (1/|G|) Σ |Fix(g)| D_4 の場合 (N=4, K=2): (16+2+4+2 + 4+4+4+4)/8 = 6 回転の和は Σ_{d|N} φ(N/d) K^d で集約できる(オイラー関数)

ヒント (段階的開示)

ヒント1: 方向性
Burnside: $\#\text{Orbits} = \frac{1}{|G|} \sum_{g} |\text{Fix}(g)|$。$|G| = 2N$($N$ 回転 + $N$ 反転)。
ヒント2: 回転の固定点
$r^k$ で不変な塗り方は周期 $\gcd(N, k)$。よって $\sum_k K^{\gcd(N,k)} = \sum_{d \mid N} \phi(N/d) K^d$。
ヒント3: 反転の固定点
$N$ 奇数: すべて「1 頂点軸」、固定点 $K^{(N+1)/2}$、$N$ 個。
$N$ 偶数: 「2 頂点軸」$N/2$ 個 ($K^{N/2+1}$) + 「2 辺中点軸」$N/2$ 個 ($K^{N/2}$)。

模範解答 (Python)

import sys
input = sys.stdin.readline
MOD = 10**9 + 7

def divisors(n):
    res = []; i = 1
    while i*i <= n:
        if n % i == 0:
            res.append(i)
            if i != n//i: res.append(n//i)
        i += 1
    return res

def prime_factors(n):
    res = []; p = 2
    while p*p <= n:
        if n % p == 0:
            res.append(p)
            while n % p == 0: n //= p
        p += 1
    if n > 1: res.append(n)
    return res

def phi(n):
    res = n
    for p in prime_factors(n):
        res = res // p * (p - 1)
    return res

def solve():
    N, K = map(int, input().split())
    inv2N = pow(2*N, MOD-2, MOD)
    rot = 0
    for d in divisors(N):
        rot = (rot + phi(N // d) * pow(K, d, MOD)) % MOD
    if N % 2:
        refl = N * pow(K, (N+1)//2, MOD) % MOD
    else:
        half = N // 2
        refl = (half * pow(K, half+1, MOD) + half * pow(K, half, MOD)) % MOD
    ans = (rot + refl) % MOD * inv2N % MOD
    print(ans)

solve()

Step-by-Step 解説

1群の同定
円環+反転 → 二面体群 $D_n$、位数 $2N$。
2回転の集約
$\sum_{k=0}^{N-1} K^{\gcd(N,k)} = \sum_{d \mid N} \phi(N/d) K^d$。約数列挙 $O(\sqrt{N})$。
3反転の場合分け
奇数 $N$: 1 種類のみ、固定点 $K^{(N+1)/2}$、$N$ 個。
偶数 $N$: 2 種類、$K^{N/2+1}$ と $K^{N/2}$、各 $N/2$ 個。
4Burnside で平均
$\frac{1}{2N}(\text{rot} + \text{refl})$、逆元はフェルマー。

計算量

約数列挙: $O(\sqrt{N})$
各約数で $\phi$ 計算: $O(\sqrt{N})$
合計: $O(\sigma_0(N) \sqrt{N}) \approx 1344 \times 31623 \approx 4 \times 10^7$

よくあるミス

ミス原因正しい書き方
奇偶の場合分け忘れ$N$ 偶数の 2 種類軸を見落とす$N \bmod 2$ で必ず分岐
逆元計算ミス$2N$ を $\bmod$ する忘れpow(2*N, MOD-2, MOD)
$\phi$ を毎回再計算素因数列を使い回さない$N$ の素因数列を 1 度求めても良い
約数列挙の重複$i = N/i$ で 2 度カウントif i != n//i ガード

次のステップ

  • 発展: 立方体・正多面体の彩色(より複雑な群)
  • 応用: ネックレス・ブレスレット、グラフ同型クラス数え
  • 関連: Pólya のサイクル指数 $Z_G(x_1, x_2, \ldots)$ による色重み付き拡張

自己評価

自分の回答

気づき・メモ