杜教筛&min_25筛复习

杜教筛

适用条件

  1. 你要能构造出\(g(x),h(x)\),使得\(h=f*g\)

  2. \(G(x),H(x)\)的值可以快速计算。

过程

我们要求的是\(F(n)=\sum_{i=1}^{n}f(i)\),现在有\(h=f*g\)\(G(x),H(x)\)分别为\(g(x),h(x)\)的前缀和。

\[\begin{aligned} H(n)=&\sum_{i=1}^{n}h(i)\\ =&\sum_{i=1}^{n}\sum_{d|i}f(\frac{i}{d})g(d)\\ =&\sum_{d=1}^{n}g(d)\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}f(i)\\ =&\sum_{d=1}^{n}g(d)F(\lfloor \frac{n}{d} \rfloor)\\ g(1)F(n)=H(n)-&\sum_{d=2}^{n}g(d)F(\lfloor \frac{n}{d} \rfloor) \end{aligned} \]

通过线性筛预处理出前\(n^{\frac{2}{3}}\)的前缀和,加上记忆化,可以做到\(O(n^{\frac{2}{3}})\)的时间复杂度。

min_25筛

适用条件

  1. \(f(P)\)的值是一个关于\(P\)的多项式。

  2. \(f(P^Q)\)的值可以快速计算。

  3. 当然,\(f(x)\)必须是一个积性函数。

原理

先咕了,咕咕咕。

第一次处理

假设\(f'(x)=x^k\),令\(g[P_i][x]\)表示所有\(f'(y)\)的和,其中\(1 \leq y \leq x\)\(y\)是质数或者\(y\)的最小质因子大于\(P_i\),有这样的递推式:

\[g[P_i][x]=g[P_{i-1}][x]-f'(P_i)(g[P_{i-1}][\lfloor\frac{x}{P_i}\rfloor]-\sum_{j=1}^{i-1}f'(P_j)),\ x \geq P_i^2 \]

\[g[P_i][x]=g[P_{i-1}][x],\ x < P_i^2 \]

\(g[P_i][x]\)的第一维可以使用滚动数组优化掉,时间复杂度为\(O(\frac{n^{\frac{3}{4}}}{\log n})\)

第二次处理

为了方便,这里使用\(g[x]\)表示\(g[P_{cnt}][x]\)\(cnt\)表示质数个数)。

\(S(x,P_i)\)表示所有\(f(y)\)的和,其中\(1 \leq y \leq x\)\(y\)的最小质因子大于等于\(P_i\),有:

\[S(x,P_i)=g[x]-\sum_{j=1}^{i-1}f(P_j)+\sum_{j=i}^{P_j^2 \leq x}\sum_{k=1}^{P_j^{k+1} \leq x}f(P_j^k)S(\lfloor\frac{x}{p_j^k}\rfloor,P_{j+1})+f(P_j^{k+1}) \]

这里无需记忆化,直接递归计算即可,时间复杂度为\(O(\frac{n^{\frac{3}{4}}}{\log n})\)

posted on 2019-04-01 22:30  ErkkiErkko  阅读(248)  评论(0编辑  收藏  举报