数论筛法

杜教筛

求积性函数 \(\sum_{i=1}^n f(i)\)

设原式 = \(S(n)\)

找到一个积性函数 \(g \rightarrow\) 区间 \(sum\) 好求,\(\sum_{i=1}^nf(i)*g(i)\) 好求

\(\sum_{i=1}^n f*g(i) = \sum_{i=1}^{n}g(i)S(\frac{n}{i})\)

那么 \(g(1)S(n) = \sum_{i=1}^n f*g(i) - \sum_{i=2}^{n}g(i)S(\lfloor \frac{n}{i} \rfloor)\)

式子后面部分整除分块递归求

关于记忆化: \(S(\lfloor \frac{n}{i} \rfloor)\) 只有 \(O(\sqrt n)\) 种可以开个 \(2 * \sqrt n\) 的数组记录

关于提前筛: \(n^{\frac{2}{3}}\) 内的和提前筛,不筛的话复杂度是 \(O(n^{\frac{3}{4}})\),筛后复杂度是 \(O(n^{\frac{2}{3}})\)

Min25

求积性函数 \(\sum_{i=1}^n f(i)\)

找到一个可以 快速求前缀和完全积性函数 \(f'(i)\) 使得对于质数 \(p\)\(f'(p)=f(p)\)

设函数 \(g(n,j) = \sum_{i=1}^n f'(i) (i\in Prime | \min\limits_{p|i} p > P_j)\)

\(dp\) 式子如下 \(\rightarrow\)

\[\begin{cases} g(n,j) = g(n, j - 1) - f'(j) \times (g(\lfloor\frac{n}{f'(j)} \rfloor,j - 1) - \sum_{i=1}^{j-1}f'(i)) & p_j^2\le n \\ g(n,j) = g(n, j - 1) & p_j^2 > n\end{cases} \]

看完下文会知道只有 \(g(n, |P|)\) 有用,所以这里的 \(g\) 是可以通过滚动数组优化 \(dp\) 数组空间,而且观察发现每次调用的是 \(g(\lfloor\frac{n}{?} \rfloor,?)\)\(\lfloor\frac{n}{?} \rfloor\) 只有 \(\sqrt n\) 种,所以 \(g\) 第一维只有 \(\sqrt n\)

设函数 \(S(n,j) = \sum_{i=1}^n f(i) (\min\limits_{p|i} p > P_j)\)

\(S(n,j) = g(n, |P|) - \sum_{i=1}^j f'(i)(前面这部分是质数的取值) + \sum\limits_{k>j}\sum\limits_{e=1}^{p_k^e \le n}f(p_k^e) \times(S(\lfloor \frac{n}{p_k^e} \rfloor,k) + [e > 1])\)

注意在 \(g,S\) 中总是不包含 \(f'(1)orf(1)\) 所以预处理要记得减去,还有最后求答案后要加上 \(f(1)\), 同时这也是 \([e>1]\) 出现在式子的原因,要把当前的 \(f\) 值也统计了,但是 \(e=1\) 是在前面质数处统计过了

最终答案即 \(S(n,0)+f(1)\)

posted @ 2024-09-21 10:25  gzyqwq  阅读(1)  评论(0编辑  收藏  举报