Day 020-Q5 — Euler's Totient Function 応用

2026-05-03 赤色 Master / Phase 8+ ★★★★★★★★★ 乗法的関数・Mertens

問題

以下の3つを解け。

  • A: $\sum_{i=1}^{N} \phi(i)$
  • B: $\sum_{i=1}^{N} \sum_{j=1}^{N} \gcd(i, j)$
  • C: $\text{lcm}(1, 2, \ldots, N) \bmod 10^9+7$

制約

$1 \le N \le 2 \times 10^5$

入出力例

入力例 1

10

出力例 1

A: 32
B: 330
C: 232792560

ヒント (段階的開示)

ヒント1: 方向性
A: 線形篩で $\phi(i)$ を $O(N)$ 全計算。B: $\sum_{d|N}\phi(d)=N$ とメビウス反転。C: lcm = 各素数 $p^k \le N$ の最大冪の積。
ヒント2: アプローチ
B: $\sum_{i,j}\gcd(i,j) = \sum_d \phi(d) \lfloor N/d \rfloor^2$。C: エラトステネスで素数を取得し $p^k \le N$ の最大冪の積。
ヒント3: 誘導
def linear_sieve(n):
    phi = list(range(n+1))
    primes = []
    for i in range(2, n+1):
        if phi[i] == i:
            primes.append(i); phi[i] = i - 1
        for p in primes:
            if i * p > n: break
            if i % p == 0:
                phi[i * p] = phi[i] * p; break
            else:
                phi[i * p] = phi[i] * (p - 1)
    return phi, primes

模範解答 (Python)

import sys
input = sys.stdin.readline

def main():
    N = int(input())
    MOD = 10**9 + 7

    phi = list(range(N + 1))
    primes = []
    is_composite = [False] * (N + 1)

    for i in range(2, N + 1):
        if not is_composite[i]:
            primes.append(i); phi[i] = i - 1
        for p in primes:
            if i * p > N: break
            is_composite[i * p] = True
            if i % p == 0:
                phi[i * p] = phi[i] * p; break
            else:
                phi[i * p] = phi[i] * (p - 1)

    ans_A = sum(phi[1:N+1])
    ans_B = sum(phi[d] * (N // d) ** 2 for d in range(1, N + 1))

    ans_C = 1
    for p in primes:
        pk = p
        while pk <= N:
            pk *= p
        pk //= p
        ans_C = ans_C * pk % MOD

    print(f"A: {ans_A}")
    print(f"B: {ans_B}")
    print(f"C: {ans_C}")

main()

Step-by-Step 解説

1Linear Sieve
各合成数は「最小素因子 × 何か」の形で一度だけ生成。$\phi$ 更新は $i \% p \neq 0$ なら $\phi(ip) = \phi(i)(p-1)$、そうでなければ $p \cdot \phi(i)$。
2問題B
$\sum_{i,j}\gcd(i,j) = \sum_d d \cdot \#\{(i,j):\gcd=d\}$。メビウス反転と $\sum_{d|n}\phi(d)=n$ で $\sum_d \phi(d)\lfloor N/d\rfloor^2$。
3問題C — lcm の構造
$\text{lcm}(1,...,N) = \prod_{p \text{ prime}, p \le N} p^{\lfloor \log_p N \rfloor}$。
4gcd 公式の証明
$\gcd(a^m-1, a^n-1) = a^{\gcd(m,n)}-1$ をユークリッド互除法の類似で。
5計算量
線形篩 $O(N)$、A/B $O(N)$、C $O(\pi(N))$。

よくあるミス

ミス原因正しい書き方
線形篩で phi[1] = 1 を忘れる初期値漏れphi = list(range(N+1)) で解決
問題Bで d * floor(N/d)^2 と誤る公式の誤解正しくは phi(d) * floor(N/d)^2
問題Cでオーバーフロー大きな積各ステップで % MOD する

次のステップ

  • 発展: $\sum_{i,j}\phi(\gcd(i,j))$ を $O(N\sqrt{N})$ で
  • メビウス関数 $\mu$ と反転公式の応用

自己評価

自分の回答

気づき・メモ