用途
设 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) (p∈Prime)
算法
Step 1:求 ∑ i = 1 n [ i ∈ P r i m e ] f ( i ) \sum_{i=1}^{n}[i\in Prime]f(i) ∑i=1n[i∈Prime]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)[i∈P or i的最小质因数>Pj]
∑ i = 1 n [ i ∈ P ] F ( i ) \sum_{i=1}^{n}[i\in P]F(i) ∑i=1n[i∈P]F(i)即为 g ( n , ∣ P ∣ ) g(n,|P|) g(n,∣P∣)( ∣ P ∣ |P| ∣P∣是 P P P集合的大小)
考虑 g g g的转移:
-
若 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,j−1) -
若 P j 2 ≤ n P_j^2\leq n Pj2≤n:
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,j−1)−∑[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,j−1)−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,j−1)−F(Pj)∑k=Pj⌊Pjn⌋[k的最小质因数>Pj−1]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,j−1)−F(Pj)[g(⌊Pjn⌋,j−1)−g(Pj−1,j−1)]
关于 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)[i∈P or i的最小质因数>Pj],
∑
i
=
1
n
[
i
∈
P
]
f
(
i
)
\sum_{i=1}^{n}[i\in P]f(i)
∑i=1n[i∈P]f(i)即为
g
(
n
,
∣
P
∣
)
g(n,|P|)
g(n,∣P∣)
编码细节:
- 转移 g g g只需用到 N \sqrt N N以内的质数,先线性筛预处理出这些质数
- g g g只需要开第一维
- 题目中的 N N N往往很大, n n n直接枚举的话会炸掉。所以要预处理一个集合 S = { ⌊ N x ⌋ ∣ x ∈ [ 1 , N ] } S=\{\lfloor\frac{N}{x}\rfloor|x\in[1,N]\} S={⌊xN⌋∣x∈[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 Pj≤N,,而所有 ≤ N \leq\sqrt N ≤N的数都可以通过 ⌊ N x ⌋ \lfloor\frac{N}{x}\rfloor ⌊xN⌋得到,所以 P j − 1 ∈ S P_j-1\in S Pj−1∈S。在具体实现时,先把 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~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=1j−1f(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=1j−1f(Pi)=g(Pj−1,j−1)) -
算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=jPk2≤n∑e=1Pke+1≤nS(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<=1∣∣Pj>n) return 0;
编码细节:
- 同上, 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