杜教筛
一、前言
寒假康复训练并承接期末考试前内容
二、讲解
1.前置知识:积性函数
- 常见的积性函数:\(\varphi,\mu,\sigma,d\)
- 常见的完全积性函数:\(\epsilon,I,id\)
其中 \(\epsilon(n)=[n=1],I(n)=1,id(n)=n\)
2.杜教筛
我们要求积性函数 \(f\) 的前缀和 \(S(n)=\sum_{i=1}^nf(i)\)
我们需要另一个积性函数 \(g\) 与狄利克雷卷积 \((f*g)(n)=\sum_{d|n}f(d)*g(\frac{n}{d})\)
我们令 \(h(n)=\sum_{i=1}^n\sum_{d|i}f(d)*g(\frac{i}{d})\)
\(h(n)=\sum_{d=1}^nf(d)\sum_{d|i}g(\frac{i}{d})\)
显然可以互换
\(h(n)=\sum_{d=1}^ng(d)\sum_{d|i}f(\frac{i}{d})\)
改写一下
\(h(n)=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i)=\sum_{d=1}^ng(d)S(\lfloor\frac{n}{d}\rfloor)\)
裂开它!
\(h(n)=g(1)S(n)+\sum_{d=2}^ng(d)S(\lfloor\frac{n}{d}\rfloor)\)
\(S(n)=\frac{h(n)-\sum_{d=2}^ng(d)S(\lfloor\frac{n}{d}\rfloor)}{g(1)}\)
所以我们只需要找到一个合适的函数 \(g\) ,使得可以快速算出上式的分子即可
一般可以用到数论分块
上式所有的 \(S\) 都可以用这个方法算出来
所以我们可以预处理一部分,递归处理一部分,加上记忆化,可以用到 \(\texttt{hash}\) 或者 \(\texttt{map}\)
其中预处理的部分取 \(n^{2/3}\) 时最优,但实际上我们开不了这么大的空间,根据实际情况适当调整即可
这就是杜教筛,时间复杂度可以做到 \(O(n^{\frac{2}{3}})\),暂时不会证明
三、例题
1.求 \(\mu\) 的前缀和
求 \(S(n)=\sum_{i=1}^n\mu(i)\)
我们不难想到这个公式:
\([n=1]=\sum_{d|n}\mu(i)\)
化!我们令 \(h(n)=[n=1],g(n)=1\),再套用上面的公式!
\(S(n)=[n=1]-\sum_{d=2}^nS(\lfloor\frac{n}{d}\rfloor)\)
后半部分显然可以数论分块
2.求 \(\varphi\) 的前缀和
求 \(S(n)=\sum_{i=1}^n \varphi(i)\)
根据 \(id(n)=\sum_{d|n}\varphi(d)\)
\(S(n)=\frac{(n+1)*n}{2}-\sum_{d=2}^nS(\lfloor\frac{n}{d}\rfloor)\)
后半部分依然可以数论分块