杜教筛&min_25筛复习
杜教筛
适用条件
-
你要能构造出\(g(x),h(x)\),使得\(h=f*g\)。
-
\(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筛
适用条件
-
\(f(P)\)的值是一个关于\(P\)的多项式。
-
\(f(P^Q)\)的值可以快速计算。
-
当然,\(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) 编辑 收藏 举报