杜教筛

一、前言

寒假康复训练并承接期末考试前内容

二、讲解

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)\)

后半部分依然可以数论分块

四、习题

例一&例二(洛谷)

神犇和蒟蒻(DarkBZOJ)

简单的数学题(洛谷)

posted @ 2021-01-31 16:12  皮皮刘  阅读(70)  评论(0编辑  收藏  举报