8.12.26 ACM-ICPC数学 数论 洲阁筛
洲阁筛是一种高效的数论筛法,主要用于处理积性函数的前缀和问题。洲阁筛以其较低的时间复杂度和较高的计算效率在数论计算中占有重要地位。本文将详细介绍洲阁筛的定义、性质、实现及应用。
一、定义
洲阁筛是一种基于递推和分块的筛法,专门用于高效计算积性函数的前缀和。其核心思想是通过递推和分块,将大问题分解成小问题,从而降低计算复杂度。
二、性质
洲阁筛可以在 𝑂(𝑛3/4log𝑛)O(lognn3/4) 或 Θ(𝑛1−𝜖)Θ(n1−ϵ) 的时间复杂度下解决一类积性函数的前缀和问题。其要求是:函数 𝑓(𝑝)f(p) 是一个关于质数 𝑝p 的项数较少的多项式或可以快速求值的函数;对于任意正整数 𝑐c,函数 𝑓(𝑝𝑐)f(pc) 也可以快速求值。
三、记号
四、解释
观察 𝐹𝑘(𝑛)Fk(n) 的定义,可以发现答案即为 𝐹1(𝑛)+𝑓(1)=𝐹1(𝑛)+1F1(n)+f(1)=F1(n)+1。
考虑如何求出 𝐹𝑘(𝑛)Fk(n)。通过枚举每个 𝑖i 的最小质因子及其次数可以得到递推式:
最后一步推导基于这样一个事实:对于满足 𝑝𝑖𝑐≤𝑛<𝑝𝑖𝑐+1pic≤n<pic+1 的 𝑐c,有 𝑝𝑖𝑐+1>𝑛 ⟺ 𝑛/𝑝𝑖𝑐<𝑝𝑖<𝑝𝑖+1pic+1>n⟺n/pic<pi<pi+1,故 𝐹𝑖+1(𝑛/𝑝𝑖𝑐)=0Fi+1(n/pic)=0。其边界值即为 𝐹𝑘(𝑛)=0Fk(n)=0 (𝑝𝑘>𝑛pk>n)。
假设现在已经求出了所有的 𝐹prime(𝑛)Fprime(n),那么有两种方式可以求出所有的 𝐹𝑘(𝑛)Fk(n):
- 直接按照递推式计算。
- 从大到小枚举 𝑝p 转移,仅当 𝑝2<𝑛p2<n 时转移增加值不为零,故按照递推式后缀和优化即可。
五、复杂度分析
对于 𝐹𝑘(𝑛)Fk(n) 的计算,其第一种方法的时间复杂度被证明为 𝑂(𝑛1−𝜖)O(n1−ϵ);对于第二种方法,其本质即为洲阁筛的第二部分,其时间复杂度被证明为 O\left(\frac{n^{\frac{3/4}}}{\log{n}}\right)。
对于 𝐹prime(𝑛)Fprime(n) 的计算,事实上,其实现与洲阁筛第一部分是相同的。考虑对于每个 𝑚=𝑛/𝑖m=n/i,只有在枚举满足 𝑝𝑘2≤𝑚pk2≤m 的 𝑝𝑘pk 转移时会对时间复杂度产生贡献,则时间复杂度可估计为:
对于空间复杂度,可以发现不论是 𝐹𝑘Fk 还是 𝐹primeFprime,其均只在 𝑛/𝑖n/i 处取有效点值,共 𝑂(𝑛)O(n) 个,仅记录有效值即可将空间复杂度优化至 𝑂(𝑛)O(n)。
六、过程
对于 𝐹𝑘(𝑛)Fk(n) 的计算,我们实现时一般选择实现难度较低的第一种方法,其在数据规模较小时往往比第二种方法的表现要好;
对于 𝐹prime(𝑛)Fprime(n) 的计算,直接按递推式实现即可。
对于 𝑝𝑘2≤𝑛pk2≤n,可以用线性筛预处理出 𝑠𝑘:=𝐹prime(𝑝𝑘)sk:=Fprime(pk) 来替代 𝐹𝑘Fk 递推式中的 𝐹prime(𝑝𝑘−1)Fprime(pk−1)。相应地,𝐺G 递推式中的 𝐺𝑘−1(𝑝𝑘−1)=∑𝑖=1𝑘−1𝑔(𝑝𝑖)Gk−1(pk−1)=∑i=1k−1g(pi) 也可以用此方法预处理。
用 Extended Eratosthenes Sieve 求积性函数 𝑓f 的前缀和时,应当明确以下几点:
- 如何快速(一般是线性时间复杂度)筛出前 𝑛n 个 𝑓f 值;
- 𝑓(𝑝)f(p) 的多项式表示;
- 如何快速求出 𝑓(𝑝𝑐)f(pc)。
明确上述几点之后按顺序实现以下几部分即可:
- 筛出 [1, 𝑛n] 内的质数与前 𝑛n 个 𝑓f 值;
- 对 𝑓(𝑝)f(p) 多项式表示中的每一项筛出对应的 𝐺G,合并得到 𝐹primeFprime 的所有 𝑂(𝑛)O(n) 个有用点值;
- 按照 𝐹𝑘Fk 的递推式实现递归,求出 𝐹1(𝑛)F1(n)。