公式解説

aac003_g 解説

By
yama_can

約数の問題に有用な関数として、メビウス関数(ここでは、μ(n)\mu(n))があり、以下が成り立ちます。
nn を素因数分解して n=piein = \prod {p_i}^{e_i} としたとき、素因数の個数を mm として

μ(n)={(1)m(e1=e2==em)0(otherwise)\mu(n) = \begin{cases} (-1)^m & (e_1 = e_2 = \cdots = e_m) \\ 0 & (\text{otherwise}) \end {cases}

なお、μ(1)=1\mu(1) = 1 となります。
これを用いると、次が成り立ちます。

dnμ(d)An/d=dnμ(d)en/dBe=enBedn/eμ(d)=Bn\begin{align} \sum_{d|n} \mu(d) A_{n/d} &= \sum_{d|n} \mu(d) \sum_{e|n/d} B_e \\ &= \sum_{e|n} B_e \sum_{d|n/e} \mu(d) \\ &= B_n \end{align}

最後の変形は、

dnμ(d)={1(m=1)0(otherwise)\sum_{d|n} \mu(d) = \begin{cases} 1 & (m=1) \\ 0 & (\text{otherwise}) \end{cases}

となることから成り立ちます。
μ(d)\mu(d)μ(n/d)\mu(n/d) が通常 111-1 になって打ち消しあう、というイメージです)

よって、

Bn=dnμ(d)An/dB_n = \sum_{d|n} \mu(d) A_{n/d}

を得ました。

あとは、

BdnBdn+μ(d)AnB_{dn} \leftarrow B_{dn} + \mu(d)A_n

のように「配る DP」の形で計算することで、計算量を O(N1+N2++NN)=O(NlogN)\mathcal O(\frac N1 + \frac N2 + \cdots + \frac N N) = \mathcal O(N \log N) に抑えることが出来ました。