杜教筛

我们现在需要求一个函数 \(f\) 的前缀和 \(S(n)=\sum_{i=1}^nf(i)\)
\(h(n)=\sum_{d\mid n}g_(d)f(\frac nd)\),即 \(h(n)=(f*g)(n)\)
那么有

\[\begin{align*} \sum_{i=1}^nh(i)&=\sum_{i=1}^n\sum_{d\mid i}g(d)f(\frac id)\\ &=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}f(i)\\ &=\sum_{d=1}^ng(d)S(\lfloor\frac nd\rfloor)\\ &=g(1)S(n)+\sum_{d=2}^ng(d)S(\lfloor\frac nd\rfloor)\\ S(n)&=\frac{\sum_{i=1}^nh(i)-\sum_{d=2}^ng(d)S(\lfloor\frac nd\rfloor)}{g(1)} \end{align*} \]

设一个阈值 \(N\),当 \(n<N\) 时预处理出答案,其祂情况用上面的式子计算。其中 \(\sum_{d=2}^ng(d)S(\lfloor\frac nd\rfloor)\) 可以用整除分块优化,并递归计算所有 \(S(\lfloor\frac nd\rfloor)\)。如果我们能选取适当的 \(h\)\(g\),使得能快速求出 \(h\)\(g\) 的前缀和,那么问题就解决了。
经测算,当 \(N\) 取到 \(maxn^{\frac23}\) 时时间复杂度取到最优,为 \(\mathcal O(n^{\frac23})\)

\(\mu\) 的前缀和。

很多时候要计算的 \(f\) 为莫比乌斯函数 \(\mu\),此时取 \(h(n)=[n=1]\)(中括号是艾弗森括号),\(g(n)=1\),由于 \([n=1]=\sum_{d\mid n}\mu(d)\),所以 \(h(n)=\sum_{d\mid n}g(d)f(\frac nd)\),而且 \(h,g\) 的前缀和都易于计算。
例题:P3172 [CQOI2015] 选数
题解

posted @ 2026-05-25 15:59  Link-Cut_Trees  阅读(10)  评论(0)    收藏  举报