Loading

[笔记]杜教筛

P1 杜教筛能干什么

给你一个积性函数 \(f(i)\),求 \(f(i)\) 的前缀和:

\[\sum _{i=1} ^n f(i) \]

注意,\(f(i)\) 必须是积性函数。

P2 怎么杜教筛

发现直接求不太行,是 \(O(n)\) 的,这样只要 \(n\le 10^9\) 就会TLE。

由于满足积性函数,不妨往数论方面想想。

考虑狄利克雷卷积,令 \(h=f*g\),其中 \(g(i)\) 是我们自己根据要求选的函数。\(h(n)\) 可以根据定义算出:

\[h(n)=\sum_{d\mid n} f(d)g(\dfrac{n}{d}) \]

再令:

\[S(n)=\sum _{i=1} ^n f(i) \]

现在,我们想求 \(h(n)\) 的前缀和:

\[\sum_{i=1}^n h(i) \]

怎么办?把定义带进去呗:

\[\sum_{i=1}^n h(i)=\sum_{i=1}^n\sum_{d\mid i} f(d)g(\dfrac{i}{d}) \]

然后发现\(\sum_{d\mid i}\) 有点难办,所以不妨换一个角度思考。我们考虑 \(q=j\cdot k,q\le n\),然后是不是 \(j\mid q\) ,而且贡献是 \(g(j)f(\dfrac{q}{j})=g(j)f(k)\)

好,现在发现凡是 \(j\) 的倍数 \(q\) 都能产生有关 \(g(j)\) 的贡献,而且是先乘后加的。这个时候就要乘法分配律了:

\[\sum_{j\mid q,q\le n} g(j)f(\dfrac{q}{j})=g(j)\sum_{p=1}^{\lfloor \tfrac{n}{j}\rfloor} f(p) \]

好好好,现在再带回去:

\[\begin{align} \sum_{i=1}^n h(i) &= \sum_{i=1}^n\sum_{d\mid i} f(d)g(\dfrac{i}{d})\\ &= \sum_{i=1}^n g(i)\sum_{p=1}^{\lfloor \tfrac{n}{i} \rfloor} f(p)\\ &= \sum_{i=1}^n g(i)S(\lfloor \dfrac{n}{i} \rfloor) \end{align} \]

现在呢,我们是不是把这个式子化成了有关于三个函数的形式,而且 \(g\) 是我们自己定义的,\(h\) 是根据 \(g\) 来的,所以实际上啊有两个都被我们捏在手里

是不是只用知道 \(g(1)S(n)\) 就可以算出 \(S(n)\),那么发现可以运用 \(h\) 函数的前缀和联系类似于差分的操作得到:

\[\begin{align} g(1)S(n)&=\sum_{i=1}^n h(i)-\sum_{i=2}^n h(i)\\ &=\sum_{i=1}^n h(i)-\sum_{i=2}^n g(i)S(\lfloor \dfrac{n}{i} \rfloor) \end{align} \]

就得到了核心式子:

\[g(1)S(n)=\sum_{i=1}^n h(i)-\sum_{i=2}^n g(i)S(\lfloor \dfrac{n}{i} \rfloor) \]

为什么要写成这样呢?你看啊,\(h\) 是不是被我们控制,那么我们只用合理设置 \(g\) 应该就能很快地算出 \(h\) 的前缀和以及 \(g(i)\) 的值了。

假设 \(\sum_{i=1}^n h(i)\)\(g(i)\)\(O(1)\) 算出,那么是不是只剩下

\[\sum_{i=2}^n g(i)S(\lfloor \dfrac{n}{i} \rfloor) \]

还是未知的,这个时候发现\(S(\lfloor \dfrac{n}{i} \rfloor)\)非常符合数论分块的形式啊,那我们就可以递归+数论分块解决。

P3 杜教筛例题

来看一道模板题:【模板】杜教筛

这个时候由于 \(n\le10^9\),而杜教筛可以做到 \(O(n^{\tfrac{2}{3}})\) 的,所以可以用杜教筛。

先考虑 \(ans1\) 怎么算。

直接算 \(\sum_{i=1}^n \phi(i)\) 肯定不行,于是我们想想它有什么性质:

\[n=\sum_{d\mid n}\phi(d) \]

是不是发现可以与一些函数使用狄利克雷卷积了呢?

\[\sum_{d\mid n}\phi(d) \cdot 1(\dfrac{n}{d})=n= id(n) \]

那么有 \(\phi* 1= id\),这个时候直接令 \(f=\phi,g=1,h=id\) 带回去就好了呀:

\[\begin{align} S(n)&=\sum_{i=1}^n id(i)-\sum_{i=2}^n S(\lfloor \dfrac{n}{i} \rfloor)\\ &=\sum_{i=1}^n i-\sum_{i=2}^n S(\lfloor \dfrac{n}{i} \rfloor)\\ &=\dfrac{n\cdot(n+1)}{2} -\sum_{i=2}^n S(\lfloor \dfrac{n}{i} \rfloor) \end{align} \]

前面部分 \(O(1)\) 求,后面部分数论分块。
再看看 \(\sum_{i=1}^n \mu(i)\)

依旧找性质,考虑莫比乌斯反演:

\[[n=1]=\sum_{d\mid n}\mu(d) \]

可以得到:

\[\mu * 1=e \]

然后可得:

\[S(n)=1-\sum_{i=2}^n S(\lfloor \dfrac{n}{i} \rfloor) \]

做完了。

P3 细节

先算出前面 \(n^{\tfrac{2}{3}}\) 的前置和,然后利用map进行记忆化搜索。

posted @ 2023-12-23 20:00  小铭同学lym  阅读(25)  评论(0)    收藏  举报