埃氏筛和线性筛就不多说了。
这里主要整理一堆能在亚线性复杂度下计算积性函数前缀和的筛法。
杜教筛
入门级筛子。比较难构造函数。
能 O(n32) 求积性函数 f(i) 的前缀和 F(n)=∑i=1nf(i)。同时也求出了所有 F(⌊kn⌋) 的值。
考虑设计一个前缀和能快速计算的积性函数 g 使得 f∗g=h 的前缀和也能快速计算,则有。
i=1∑n(f∗g)(i)∴F(n)=i=1∑nd∣i∑f(di)g(d)=d=1∑ng(d)i=1∑⌊n/d⌋f(i)=d=1∑ng(d)F(⌊dn⌋)=F(n)+d=2∑ng(d)F(⌊dn⌋)=i=1∑n(f∗g)(i)−d=2∑ng(d)F(⌊dn⌋)
整除分块求解即可。复杂度为 O(n43)。
预处理前 O(n32) 个 f,将复杂度平衡至 O(n32)。
复杂度积分一下就能证了。
Min_25 筛
很强的筛子。
能 O(n1−ϵ) 求解一类积性函数 f(i) 的前缀和 F(n) 。但是只能求出单点的前缀和值。优点是跑得飞快。
其思想为先求出对于 G(n)=∑i=1nf(i)⋅[i is prime] 的所有 G(⌊kn⌋) 的值。然后再用其求 F(n)。
我们需要找到一个完全积性函数 g 使得 g 在质数处的取值与 f 相同。那么可以得出 G(n)=∑i=1ng(i)⋅[i is prime]。
现在我们就拆分出了两个问题:
- 对于一个完全积性函数 g,求出所有的 G(⌊kn⌋)。
- 利用刚刚求得的所有 G(⌊kn⌋),求出 F(n)。
假设我们已经做完了第一个问题,现在我们需要求解 F(n)。
考虑到所有合数的最小质因子一定 ≤n,因此我们可以对这个最小质因子做递归。具体来讲,设
F(i,j)=k=1∑jf(k)[k 的最小质因子≥pi]
其中 pi 表示第 i 个质数。F(n) 就等于 F(1,n)+f(1)。考虑递归计算 F(i,j),将所有可能的最小质因子单独拎出来:
F(i,j)=k≥i,pk2≤j∑pke+1≤j∑f(pke+1)+f(pke)×F(k+1,⌊pkej⌋)+G(j)−k=1∑i−1f(pk)⋯(1)⋯(2)
(1) 处,枚举当前满足条件的数的最小质因子 pk 及其幂次。
(2) 处,将质数位置的函数值加入,但需要减去 <pi 的质数位置的函数值。
不需要记忆化。
这一步的复杂度被证明是 O(n1−ϵ) 的,但是实测 1010 量级无压力。
下面问题是,如何求出所有的 G(⌊kn⌋)。
可以采用类似的定义,设
G(i,j)=k=1∑jg(k)⋅[k is prime or k 的最小质因子>pi]
这样 G(t,n) 就是 G(n) 的值(t 表示 ≤n 的素数个数)。
那么可以考虑用类似方法,把 pi 的影响筛掉来更新新的 G 值。
G(i,j)=G(i−1,j)−k=1∑jg(k)⋅[k is not prime and k 的最小质因子=pi]=G(i−1,j)−G(i−1,⌊pij⌋)⋅g(pi)+(k=1∑i−1g(pk))⋅g(pi)
其中,G(i−1,⌊pij⌋) 代表了所有质数 p1,p2,…,pi−1 以及一切最小质因子 ≥pi 的数。我们希望减去一切最小质因子 ≥pi 的数乘上 pi 的函数值,也就是所有最小质因子就是 pi 的情况下的函数值。而直接减去 G(i−1,⌊pij⌋)⋅g(pi) 后多减掉了所有 p1pi,p2pi,…,pi−1pi 这些位置的函数值,因此需要加回来。
需要预处理 ∑j=1ig(pj)。
这一步骤的复杂度被证明是 O(lognn43) 的。
Powerful Number 筛
留坑待填。