杜教筛&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))的前缀和。

[egin{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} floor}f(i)\ =&sum_{d=1}^{n}g(d)F(lfloor frac{n}{d} floor)\ g(1)F(n)=H(n)-&sum_{d=2}^{n}g(d)F(lfloor frac{n}{d} floor) 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}][lfloorfrac{x}{P_i} floor]-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(lfloorfrac{x}{p_j^k} floor,P_{j+1})+f(P_j^{k+1}) ]

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

原文地址:https://www.cnblogs.com/ErkkiErkko/p/10639716.html