杜教筛、Min25筛
posted on 2025-09-22 13:44:08 | under | source
杜教筛
欲求 \(Sf(n)=\sum\limits_{i=1}^{n} f(i)\),构造 \(f\times g=h\),那么 \(\sum h=\sum\limits_{ij\le n} f(i)g(j)\),进而得到杜教筛核心式子:
便能整除分块递归下去,所以还顺带做了块筛。
直接做是 \(O(n^{\frac 34})\),顺带一提,不用记忆化。可以线性筛预处理 \(\le n^{\frac 23}\) 的,这样便是 \(O(\frac 23)\)。
限制:积性函数 \(g,h\) 需要足够简洁,以快速求出前缀和。
Min_25 筛
欲求 \(f\) 前缀和,构造一个在质数处与之相同的完全积性函数 \(g\)。
大致思想:将 \(f\) 分质数合数讨论,合数可递推,质数可用 \(g\) 计算。而递推的状态设计基于最小的质数 \(p\),这样的好处是:特判掉质数的情况,那么有用的 \(p\le \sqrt n\)。
记号:\(mi(x)\) 为 \(x\) 的最小质因子,\(p_i\) 为从小到大第 \(i\) 个质数,\(P\) 为 \(\le \sqrt n\) 的质数集合。
注意下面的 \(G,F\) 都不包含 \(1\)。
处理 g
记 \(G(n,j)=\sum\limits_{i} g(i)(i\in {\rm P}\mid mi(i)>p_j)\),欲求 \(G(n,|P|)\),初值 \(G(n,0)=\sum g\)。
考虑从 \(G(n,j-1)\) 推到 \(G(n,j)\),减去 \(mi(x)=p_j\) 的即可:
处理 f
记 \(F(n,j)=\sum\limits_{i} f(i)(mi(i)>p_j)\)。
- 质数:\(G(n,|P|)-\sum\limits_{k=1}^{j} f(k)\)。
- 合数,枚举最小质因子及次数:\(\sum\limits_{k>j}\sum\limits_{e=1}^{{p_k}^e\le n} f({p_k}^e)\times (F(\frac n{{p_k}^e},k)+[e>1])\)。
\([e>1]\) 是因为 \({p_k}^e\) 在 \(e>1\) 时应被算入。
复杂度 & 小技巧
根据神秘分析,求 \(F\) 无需记忆化,\(O(\frac {n^{\frac 34}}{\log n})\)。
而 \(G\) 需要记忆化,注意到每次递归会除一个数,而 \(\frac {\frac na}b=\frac {n}{ab}\)。于是只用处理 \(\frac nk\) 的值(都是下取整),根号级别。
技巧:\(x\le \sqrt n\) 用 \(id1(x)\) 记录,\(x>\sqrt n\) 用 \(id2({\frac nx})\) 记录。

浙公网安备 33010602011771号