min_25筛

用途

f ( x ) f(x) f(x)是一个积性函数,min_25筛可以在 O ( n 3 4 log ⁡ n ) O(\frac{n^{\frac{3}{4}}}{\log n}) O(lognn43)内求 f ( x ) f(x) f(x)的前缀和: ∑ i = 1 N f ( i ) \sum_{i=1}^{N}f(i) i=1Nf(i)

使用要求: f ( p ) , f ( p k ) f(p),f(p^k) f(p),f(pk)的值可以快速求出 ( p ∈ P r i m e ) (p\in Prime) (pPrime)

算法

Step 1:求 ∑ 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)

约定 P P P表示质数集合, P i P_i Pi表示第 i i i个质数

首先我们要根据 f ( x ) f(x) f(x)在质数处的点值的表达式构造出 F ( x ) F(x) F(x)(有时需要把 f ( x ) f(x) f(x)拆成多个 F ( x ) F(x) F(x),满足 F ( x ) F(x) F(x)是一个完全积性函数,并且 F ( x ) F(x) F(x)的和可以迅速转换成 f ( x ) f(x) f(x)的和

然后设 g ( n , j ) = ∑ i = 1 n F ( i ) [ i ∈ P    o r    i 的 最 小 质 因 数 > P j ] g(n,j)=\sum_{i=1}^nF(i)[i\in P\ \ or \ \ i的最小质因数>P_j ] g(n,j)=i=1nF(i)[iP  or  i>Pj]

∑ i = 1 n [ i ∈ P ] F ( i ) \sum_{i=1}^{n}[i\in P]F(i) i=1n[iP]F(i)即为 g ( n , ∣ P ∣ ) g(n,|P|) g(n,P) ∣ P ∣ |P| P P P P集合的大小)

考虑 g g g的转移:

  1. P j 2 > n P_j^2>n Pj2>n
    显然不会产生新的贡献了,此时有 g ( n , j ) = g ( n , j − 1 ) g(n,j)=g(n,j−1) g(n,j)=g(n,j1)

  2. P j 2 ≤ n P_j^2\leq n Pj2n
    g ( n , j ) = g ( n , j − 1 ) − ∑ [ i 的 最 小 质 因 数 = P j ] F ( i ) g(n,j)=g(n,j-1)-\sum[i的最小质因数=P_j]F(i) g(n,j)=g(n,j1)[i=Pj]F(i)
    = g ( n , j − 1 ) − F ( P j ) ∑ [ i 的 最 小 质 因 数 = P j ] F ( i P j ) =g(n,j-1)-F(P_j)\sum[i的最小质因数=P_j]F(\frac{i}{P_j}) =g(n,j1)F(Pj)[i=Pj]F(Pji)
    = g ( n , j − 1 ) − F ( P j ) ∑ k = P j ⌊ n P j ⌋ [ k 的 最 小 质 因 数 > P j − 1 ] F ( k ) =g(n,j-1)-F(P_j)\sum_{k=P_j}^{\lfloor\frac{n}{P_j}\rfloor}[k的最小质因数>P_{j-1}]F(k) =g(n,j1)F(Pj)k=PjPjn[k>Pj1]F(k)
    = g ( n , j − 1 ) − F ( P j ) [ g ( ⌊ n P j ⌋ , j − 1 ) − g ( P j − 1 , j − 1 ) ] =g(n,j-1)-F(P_j)[g(\lfloor\frac{n}{P_j}\rfloor,j-1)-g(P_j−1,j−1)] =g(n,j1)F(Pj)[g(Pjn,j1)g(Pj1,j1)]

关于 g g g的初值:

考虑一下 g g g的实际含义是什么呢?可以参考一下埃氏筛法的运行过程。

假设现在有 n n n个数依次排开,第 i i i个数是 f ( i ) f(i) f(i),根据埃氏筛法的那套理论,每次选出一个质数 p p p,然后筛掉所有 f ( k × p ) f(k\times p) f(k×p) ( k > = 2 ) (k>=2) (k>=2)

会发现 g ( n , j ) g(n,j) g(n,j)就是运行 j j j次埃氏筛法后,没被筛掉的所有数之和。

这里递推的起点是 g ( n , 0 ) g(n,0) g(n,0) g ( n , 0 ) g(n,0) g(n,0)的含义是把所有的数字当作质数,然后求 ∑ i = 1 n F ( i ) \sum_{i=1}^nF(i) i=1nF(i)

最后,我们把 F ( x ) F(x) F(x)转回 f ( x ) f(x) f(x)
g ( n , j ) g(n,j) g(n,j)表示 ∑ i = 1 n f ( i ) [ i ∈ P    o r    i 的 最 小 质 因 数 > P j ] \sum_{i=1}^nf(i)[i\in P\ \ or \ \ i的最小质因数>P_j ] i=1nf(i)[iP  or  i>Pj]
∑ i = 1 n [ i ∈ P ] f ( i ) \sum_{i=1}^{n}[i\in P]f(i) i=1n[iP]f(i)即为 g ( n , ∣ P ∣ ) g(n,|P|) g(n,P)

编码细节:

  1. 转移 g g g只需用到 N \sqrt N N 以内的质数,先线性筛预处理出这些质数
  2. g g g只需要开第一维
  3. 题目中的 N N N往往很大, n n n直接枚举的话会炸掉。所以要预处理一个集合 S = { ⌊ N x ⌋ ∣ x ∈ [ 1 , N ] } S=\{\lfloor\frac{N}{x}\rfloor|x\in[1,N]\} S={xNx[1,N]},集合 S S S的大小 ∣ S ∣ = 2 N |S|=2\sqrt N S=2N 。递推式中, ⌊ n P j ⌋ \lfloor\frac{n}{P_j}\rfloor Pjn一定 ∈ S \in S S,因为 P j ≤ N P_j\leq \sqrt N PjN ,,而所有 ≤ N \leq\sqrt N N 的数都可以通过 ⌊ N x ⌋ \lfloor\frac{N}{x}\rfloor xN得到,所以 P j − 1 ∈ S P_j-1\in S Pj1S。在具体实现时,先把 S S S离散化一下,调用 g g g的第一维时,直接枚举离散化后 S S S中各元素的编号。

Step 2:求最终答案

S ( n , j ) = ∑ i = 1 n f ( i ) [ i 的 最 小 质 因 数 > = P j ] S(n,j)=\sum_{i=1}^{n}f(i)[i的最小质因数>=P_j] S(n,j)=i=1nf(i)[i>=Pj]

最终答案即为 S ( n , 1 ) + f ( 1 ) S(n,1)+f(1) S(n,1)+f(1)

考虑 S S S的转移:

  1. 算1~n中质数的贡献:
    S ( n , j ) + = g ( n , j ) − ∑ i = 1 j − 1 f ( P i ) S(n,j)+=g(n,j)−\sum_{i=1}^{j−1}f(P_i) S(n,j)+=g(n,j)i=1j1f(Pi)
    ∑ i = 1 j − 1 f ( P i ) = g ( P j − 1 , j − 1 ) \sum_{i=1}^{j−1}f(P_i)=g(P_{j-1},j-1) i=1j1f(Pi)=g(Pj1,j1)

  2. 算1~n中合数的贡献:
    S ( n , j ) + = ∑ k = j P k 2 ≤ n ∑ e = 1 P k e + 1 ≤ n S ( n P k e , k + 1 ) × f ( P k e ) + f ( P k e + 1 ) S(n,j)+=\sum_{k=j}^{P_k^2\leq n}\sum_{e=1}^{P_k^{e+1}\leq n}S(\frac{n}{P_k^e},k+1)\times f(P_k^e)+f(P_k^{e+1}) S(n,j)+=k=jPk2ne=1Pke+1nS(Pken,k+1)×f(Pke)+f(Pke+1)
    (枚举合数的最小质因数及其最小质因数的指数)

边界条件:
i f ( n < = 1 ∣ ∣ P j > n )   r e t u r n   0 ; if(n<=1||P_j>n)\ return\ 0; if(n<=1Pj>n) return 0;

编码细节:

  1. 同上, g g g的第一维用离散化后 S S S中各元素的编号表示

参考博客:
https://www.cnblogs.com/yoyoball/p/9185144.html
https://blog.csdn.net/baiyifeifei/article/details/90454317
https://www.cnblogs.com/zhoushuyu/p/9187319.html
https://www.cnblogs.com/cjyyb/p/9185093.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值