目录
min_25 筛思想
min_25 筛将求积性函数的前缀和分为质数的贡献和非质数的贡献,最后求和。
这样,我们可以通过先求出质数的贡献,再利用质数贡献反算出合数的贡献,从而快速求和
要让 min_25 筛实现,只需要积性函数 (oldsymbol f) 在质数的整数次方出能快速计算即可
min_25 筛的质数贡献
考虑 (displaystyle ans=sum_{i=1}^noldsymbol f(i))
我们现在设几个新的函数 (oldsymbol f'_k(n)) ,满足以下性质:
- (forall oldsymbol f'_k) 为完全积性函数
- (sumoldsymbol f'_k(p)=oldsymbol f(p))
- (forall oldsymbol f'_k) 可快速求和
那么,由于 (displaystyle sum_{i=1}^n[iin Prime]oldsymbol f(i)=sum_{i=1}^n[iin Prime](sum oldsymbol f'_k)(i)=sum sum_{i=1}^n[iin Prime]oldsymbol f'_k(i))
因此,我们的问题转化为了求解 (displaystyle sum_{i=2}^n[iin Prime]oldsymbol f'_k(i))
我们记 (displaystyle g(n,j)=sum_{i=2}^n[iin Primevee fc_i>p_j]oldsymbol f'_k(i))
其中 (Prime) 为 ([1,n]) 中的质数集合, (p_j) 是 (Prime) 内第 (j) 小的数(即第 (j) 个质数), (fc_i) 为 (i) 的最小质因数
因此 (g(n,j)) 表示的是,质数和最小质因数大于 (p_j) 的数的贡献
很显然,我们要求的 (displaystyle sum_{i=2}^n[iin Prime]oldsymbol f'_k(i)=g(n,Card(Prime) ))
(Card(A)) 表示集合 (A) 的元素数量
而初始状态,则为 (displaystyle g(n,0)=sum_{i=2}^n[iin Primevee fc_i>p_0]oldsymbol f'_k(i)=sum_{i=2}^noldsymbol f'_k(i)=sum_{i=1}^noldsymbol f'_k(i)-oldsymbol f'_k(1)=sum_{i=1}^noldsymbol f'_k(i)-1)
由于 (oldsymbol f'_k) 的前缀和能快速求解,所以 (g(n,0)) 是能快速求解的
接下来我们考虑怎么从 (g(n,0)) 递推至 (g(n,Card(Prime) ))
当从 (g(n,m-1)) 递推至 (g(n,m)) 时,我们需要删去最小质因数为 (p_m) 的合数的贡献
首先,当 (p_m>sqrt n) 时,一定是没有任何合数满足最小质因数为 (p_m) 这一条件的
因此 (g(n,m)=g(n,m-1))
对于剩余的情况,我们是要删去最小质因数为 (p_m) 的合数
而对于所有最小质因数为 (p_m) 的合数,一定是 (p_m) 乘上一个最小质因数大于 (p_{m-1}) 的数(注意,这边质数也是符合条件的)
所以这些 (fc_i=p_m) 的合数的 (oldsymbol f'_k) 值,一定可以写成 (displaystyle sum_{i=2}^{p_mcdot ileq n}oldsymbol f'_k(p_mcdot i)[fc_i>p_{m-1}])
由于 (oldsymbol f'_k) 为完全积性函数,所以我们可以把这个展开 (displaystyle sum_{i=2}^{ileq n/p_m}oldsymbol f'_k(p_m)cdot oldsymbol f'_k(i)[fc_i>p_{m-1}]=oldsymbol f'_k(p_m)cdot sum_{i=2}^{n/p_m}[fc_i>p_{m-1}]oldsymbol f'_k(i))
我们这边用一个很巧妙的转化: (displaystyle sum_{i=2}^{n/p_m}[fc_i>p_{m-1}]oldsymbol f'_k(i)=sum_{i=2}^{n/p_m}[fc_i>p_{m-1}vee iin Prime]oldsymbol f'_k(i)-sum_{i=1}^{m-1}oldsymbol f'_k(p_i))
前一个求和号即为 (g(n/p_m,m-1)) ,后面那个求和号我们记为 (Sp(m-1)) ,由于 (p_i<p_mleq sqrt n) 我们可以线筛处理
因此,带回去,我们从 (g(n,m-1)) 转移到 (g(n,m)) 应该减去 (oldsymbol f'_k(p_m)(g(n/p_m,m-1)-Sump(m-1) ))
最后我们总结一下思路:
先线筛出 (oldsymbol f'_k) 在 (sqrt n) 内的函数值、质数前缀和
然后利用递推式:(g(n,m)=egin{cases} g(n,m-1),p_m^2> n \ \ g(n,m-1)-oldsymbol f'_k(g(n/p_m,m-1)-Sp(m-1) ),p_m^2leq n end{cases})
由于 (n/d) 的取值只有 (2sqrt n) 个,我们只需要处理这 (2sqrt n) 的取值即可,而且第二维还能利用滚动出去空间上的开销
于是,质数的贡献 (displaystyle sum_{i=1}^n[iin Prime]oldsymbol f(i)) 只需要对我们求出来的求和即可求出
这一部分的复杂度经证明为 (O({n^{3over 4}over log n}))
min_25 筛的总贡献
接下来我们考虑如何求解我们想要的 (displaystyle ans=sum_{i=1}^noldsymbol f(i))
我们设 (displaystyle S(n,m)=sum_{i=2}^n[fc_igeq p_m]oldsymbol f(i)) 则 (ans=S(n,1)+oldsymbol f(1)=S(n,1)+1)
而我们还是思考如何递推求得 (S(n,1))
首先,对于 (p_{m-1}^2leq nleq p_m^2) ,很容易得到
(displaystyle S(n,m)=sum_{i=2}^n[fc_igeq p_m]oldsymbol f(i)=sum_{i=2}^n[iin Primevee igeq p_m]oldsymbol f(i)=sum_{i=2}^n[iin Prime]oldsymbol f(i)-sum_{i=2}^{m-1}oldsymbol f(p_i))
前面那个求和号我们刚刚求出来了,后面那个求和号实际上就算 (Sump(m-1)) ,能快速求出
考虑从 (S(n,m+1)) 递推至 (S(n,m)) 肯定会增加,增加的是最小质因数为 (p_m) 的贡献
即 (displaystyle sum_{i=2}^n[fc_i=p_m]oldsymbol f(i))
把它分为质数和合数考虑,如果是合数,再按质因数中含多少 (p_m) 处理:
当质因数中含 (e) 个 (p_m) 的,我们考虑它的贡献为
(displaystyle sum_{i=2}^n[p_m^emid nwedge p_m^{e+1} mid n]oldsymbol f(i)=oldsymbol f(p_m^e)+sum_{i=2}^{p_m^ecdot ileq n}[fc_i>p_m]oldsymbol f(p_m^ecdot i)=oldsymbol f(p_m^e)+sum_{i=2}^{n/p_m^e}[fc_igeq p_{m+1}]oldsymbol f(p_m^e)cdot oldsymbol f(i)=oldsymbol f(p_m^e)+oldsymbol f(p_m^e)cdot sum_{i=2}^{n/p_m^e}[fc_igeq p_{m+1}]oldsymbol f(i))
根据定义,很明显可以发现,求和号就是 (S(n/p_m^e,m+1))
因此,对于质因数含有 (e) 个 (p_m) 的,对 (S(n,m+1)) 递推至 (S(n,m)) 的贡献为 (oldsymbol f(p_m^e)+oldsymbol f(p_m^e)cdot S(n/p_m^e,m+1))
所以由 (S(n,m+1)) 递推至 (S(n,m)) 的贡献为 (displaystyle sum_{e=1}^{p_m^eleq n}(oldsymbol f(p_m^e)cdot S(n/p_m^e,m+1)+f(p_m^{e+1}) ))
故 (displaystyle S(n,m)=sum_{i=2}^n[iin Prime]oldsymbol f(i)-Sump(m-1)+sum_{i=j}^{p_i^2leq n}sum_{e=1}^{p_i^eleq n}(oldsymbol f(p_i^e)cdot S(n/p_i^e,i+1)+oldsymbol f(p_i^{e+1}) ))
由于第二维没办法滚动,记忆化难度较大,因此,只能递归求解
经证明,复杂度为 (O(n^{1-varepsilon}))
这个复杂度是比较神奇的,其表明当 (n) 趋近于无穷大的时候,复杂度会无限接近于 (O(n))
但这并不表明它是 (O(n)) 的,事实上,好像绝大部分情况下都跑得比洲阁筛更快
因此,min_25 筛的总复杂度为 (O({n^{3over 4}over log n}+n^{1-varepsilon}))