杜教筛
我们现在需要求一个函数 \(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] 选数
题解

浙公网安备 33010602011771号