Min25筛详解

Min25筛详解

min25筛有什么用?

目的: 求出 ∑ i − 1 N f ( i ) \sum_{i-1}^Nf(i) i1Nf(i)的前缀和,其中前置条件为

  • f ( i ) f(i) f(i) 当i为素数时,能够用 i k i^k ik表达,例如 f ( i ) = i 1 + i 2 + i 3 f(i)=i^1+i^2+i^3 f(i)=i1+i2+i3等形式,常见的有 ϕ μ \phi \quad \mu ϕμ函数。

  • f ( i ) f(i) f(i)是积性函数

怎么求?

分两步走

  • 处理素数
  • 处理合数

处理素数

素数部分

∑ i = 1 N [ i ∈ p r i m e ] f ( i ) \sum_{i=1}^N[i \in prime] f(i) i=1N[iprime]f(i)

既然素数的函数值能够简单的被表达那么肯定可以求出来。

  1. 设前缀和 s u m i sum_i sumi

    s u m i = ∑ i − 1 i f ( p r i m e i ) sum_i = \sum_{i-1}^if(prime_i) sumi=i1if(primei) 即前i个素数的函数值的前缀和

  2. 设函数 g ( N , i ) g(N,i) g(N,i)

    g ( N , i ) = ∑ j = 1 N [ j ∈ p r i m e ∣ M i n j > p r i m e i ] ∗ f ( j ) g(N,i) = \sum_{j=1}^N[j \in prime \mid Min_j > prime_i]*f(j) g(N,i)=j=1N[jprimeMinj>primei]f(j)

    通俗的来说, g ( N , i ) g(N,i) g(N,i)就表示 N N N以内的在埃拉特斯特尼筛算法进行第 i i i轮后尚未被筛去的数的函数值的和。

    显然我们要求的就是
    g ( N , ∞ ) = ∑ i = 1 N [ i ∈ p r i m e ] f ( i ) g(N,\infty) = \sum_{i=1}^N[i \in prime] f(i) g(N,)=i=1N[iprime]f(i)

    其实不用到达无穷大,最大到达的为 n \sqrt{n} n 内的素数个数

考虑怎么求出这个式子,考虑i从小往大递推,g(N,0)的时候发现就是一个简单的幂次前缀和,这里一般可以用公式来做。
g ( N , 0 ) = s u m ( N ) g(N,0) = sum(N) g(N,0)=sum(N)
考虑如何从 g ( N , i − 1 ) = > g ( N , i ) g(N,i-1) => g(N,i) g(N,i1)=>g(N,i)

埃筛的思路

  • p r i m e i 2 > N prime_{i}^2>N primei2>N时,显然已经筛不出任何的数

  • p r i m e i 2 < = N prime_i^2 <=N primei2<=N时,考虑 N N N中被 p r i m e i prime_i primei筛去的数(没有被 p r i m e i prime_i primei小的素数筛掉的数中)
    g ( N , i ) = g ( N , i − 1 ) − f ( p r i m e i ) ∗ ( g ( ⌊ N p r i m e i ⌋ , i − 1 ) − s u m i − 1 ) g(N,i) = g(N,i-1) - f(prime_i) * (g(\lfloor\frac{N}{prime_i} \rfloor, i-1 ) - sum_{i-1}) g(N,i)=g(N,i1)f(primei)(g(primeiN,i1)sumi1)
    解释一下上面这个式子,假设 N = 16 , i = 1 N=16 , i = 1 N=16,i=1时,式子变为
    g ( N , i ) = g ( N , i − 1 ) − f ( 2 ) ∗ ( g ( 8 , 0 ) ) g(N,i) = g(N,i-1) - f(2) * (g(8, 0 )) g(N,i)=g(N,i1)f(2)(g(8,0))
    很显然 g ( 8 , 0 ) ∗ f ( 2 ) g(8,0) * f(2) g(8,0)f(2)此时为 ( f ( 1 ) + f ( 2 ) + ⋯ + f ( 8 ) ) ∗ f ( 2 ) (f(1)+f(2)+\cdots +f(8)) * f(2) (f(1)+f(2)++f(8))f(2),因为是积性函数,所以就相当于把2的倍数的值给全都算出来了给删除了。所以最后的出g的递推式为
    g ( N , i ) = { g ( N , i − 1 ) p r i m e i 2 > N g ( N , i − 1 ) − f ( p r i m e i ) ∗ ( g ( ⌊ N p r i m e i ⌋ , i − 1 ) − s u m i − 1 ) p r i m e i 2 < = N g(N,i) = \begin{cases} g(N,i-1)\quad \quad prime_i^2>N\\ g(N,i-1) - f(prime_i) * (g(\lfloor\frac{N}{prime_i} \rfloor, i-1 ) - sum_{i-1}) \quad \quad \quad prime_i^2 <=N \end{cases} g(N,i)={g(N,i1)primei2>Ng(N,i1)f(primei)(g(primeiN,i1)sumi1)primei2<=N

这个式子被证明复杂度在 O ( n 3 4 l o g N ) O(\frac{n^{\frac{3}{4}}}{logN}) O(logNn43)

处理合数

再明确一次我们需要求的答案
∑ i = 1 N f ( i ) \sum_{i=1}^N f(i) i=1Nf(i)
此时我们已经有了
∑ i = 1 N [ i ∈ p r i m e ] f ( i ) \sum_{i=1}^N[i \in prime]f(i) i=1N[iprime]f(i)
且f(i)是积性函数,那么就很方便了

定义一个函数
S ( N , i ) = ∑ j = 1 N [ M i n j > p r i m e i ] ∗ f ( i ) S(N,i) = \sum_{j=1}^N[Min_j > prime_i] * f(i) S(N,i)=j=1N[Minj>primei]f(i)
即满足所有最小质因子大于等于 p r i m e i prime_i primei f ( i ) f(i) f(i)的和,埃筛i轮后剩下的值

S ( N , i ) S(N,i) S(N,i)分为两部分,刚刚的素数部分我们已经解决了
S ( N , i ) = g ( N , ∞ ) − s u m i − 1 + 合 数 S(N,i) = g(N,\infty) - sum_{i-1} + 合数 S(N,i)=g(N,)sumi1+
合数部分怎么解决?

因为 f f f是一个积性函数,所以我们枚举合数的最小质因子及其出现的次数即可
∑ j = i p r i m e j 2 < = N ∑ k = 1 p r i m e j k < = N ( S ( ⌊ N p r i m e j k ⌋ , i − 1 ) ∗ f ( p r i m e j k ) + f ( p r i m e j k + 1 ) ) \sum_{j=i}^{prime_j^2<=N}\sum_{k=1}^{prime_j^k<=N}(S(\lfloor \frac{N}{prime_j^k} \rfloor,i-1)*f(prime_j^k) +f(prime_j^{k+1})) j=iprimej2<=Nk=1primejk<=N(S(primejkN,i1)f(primejk)+f(primejk+1))
解释一下这个很长的和式

第一部分枚举从第i个质数开始枚举,因为当前是第i轮 p r i m e j prime_j primej

第二部分则枚举这个质数的幂次

后面一部分跟求 g g g的思路是类似的,最后加上 f ( p r i m e j k + 1 ) f(prime_j^{k+1}) f(primejk+1)是因为当 N p r i m e j k = 0 \frac{N}{prime_j^k}=0 primejkN=0时,进入的话会返回0,所以在外面加上,例如S(1,0)时,我们会直接返回0,f(8)则没有计算到。

完了,min25筛结束了

主要的解题思路为:

  • 分块
  • 处理素数的前缀和
  • 写S函数
  • 求答案

因为这里用到的所有的数都是 N i \frac{N}{i} iN的形式,所以很显然的可以进行分块处理。

模板题

LOJ 6053

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页