作用
min25筛可以在复杂度O(
n
3
4
log
(
n
)
\frac{n^{\frac{3}{4}}}{\log(n)}
log(n)n43)是一种亚线性筛。求积性函数f(x)的前缀和。求和条件x属于质数,
f
(
x
)
f(x)
f(x)可以用多项式表示出来,且
f
(
x
c
)
f(x^c)
f(xc)可以快速求出。
预备思想
对于小于n的数,要么是质数,要么这个数的最小质因子小于等于
n
\sqrt{n}
n,将所有数分为质数与合数,利用上述原理和埃氏筛法的类似思想可以快速统计答案。
求法
*要将所有的
x
=
⌊
n
i
⌋
x=\lfloor\frac ni\rfloor
x=⌊in⌋的
∑
i
=
1
x
[
i
是
质
数
]
f
(
i
)
\sum_{i=1}^x[i是质数]f(i)
∑i=1x[i是质数]f(i)求出
首先来计算x为质数的和。定义g(n,j)为把1到n所有的i为质数或者i的最小质因子大于第j个质数的f(i)求和。
g
(
n
,
j
)
=
∑
i
=
1
n
[
i
∈
P
o
r
min
(
p
)
>
P
j
]
f
(
i
)
g(n,j)=\sum_{i=1}^{n}[i \in P \ or\ \min(p)>P_j]f(i)
g(n,j)=∑i=1n[i∈P or min(p)>Pj]f(i)
那么对于质数部分总和显然就是g(n,|P|),其中|P|为
n
\sqrt{n}
n内质数集的大小。
计算g(n, j)的大小:
对于
P
j
2
>
n
P_j^2 > n
Pj2>n:因为之后不存在最小质因子大于
P
j
P_j
Pj的合数,所以可以得到g(n, j) = g(n, j - 1)
对于
P
j
2
<
=
n
P_j^2<=n
Pj2<=n想要通过g(n, j - 1)得到g(n, j),需要减去g(n, j - 1)多贡献的部分,实际上就是减去最小质因子为
P
j
P_j
Pj的贡献,那么利用上积性函数的性质就是减去提取质因子
P
j
P_j
Pj的函数后最小质因子大于等于
P
j
P_j
Pj的和,也就相当于
f
(
p
j
)
∗
f(p_j)*
f(pj)∗
(
g
(
n
p
j
,
j
−
1
)
(g(\frac{n}{p_j}, j - 1)
(g(pjn,j−1) -
∑
i
=
1
j
−
1
f
(
P
i
)
)
\sum_{i=1}^{j-1}f(P_i))
∑i=1j−1f(Pi))(减掉的是其中小于
P
j
的
质
数
的
函
数
值
P_j的质数的函数值
Pj的质数的函数值)
所以最后:
g
(
n
,
j
)
=
{
g
(
n
,
j
−
1
)
P
j
2
>
n
g
(
n
,
j
−
1
)
−
f
(
P
j
)
[
g
(
n
P
j
,
j
−
1
)
−
∑
i
=
1
j
−
1
f
(
P
i
)
]
P
j
2
≤
n
g(n,j)=\begin{cases} g(n,j-1)&P_j^2\gt n\\ g(n,j-1)-f(P_j)[g(\frac{n}{P_j},j-1)-\sum_{i=1}^{j-1}f(P_i)]&P_j^2\le n\end{cases}
g(n,j)={g(n,j−1)g(n,j−1)−f(Pj)[g(Pjn,j−1)−∑i=1j−1f(Pi)]Pj2>nPj2≤n
结合积性函数的性质,j每增加1相当于对于筛去质数
P
j
P_j
Pj的倍数的函数值剩余的f(x)的和。
那么对于g(n, 0)就相当于一个数没有筛去,所有数的和。将每个数带入多项式求和,这个求和一般可以化简。
处理完质数的和之后来考虑综合的求解:
我们设
S
(
n
,
j
)
=
∑
i
=
1
n
[
min
(
p
)
≥
P
j
]
f
(
i
)
S(n,j)=\sum_{i=1}^n[\min(p)\ge P_j]f(i)
S(n,j)=∑i=1n[min(p)≥Pj]f(i)即求最小质因子大于等于
P
j
P_j
Pj的f(i)的和。最终答案为S(n, 1) + f(1)。
看做两部分一部分质数一部分合数,质数部分的我们可以通过
g
(
n
,
j
)
−
∑
i
=
1
j
−
1
f
(
P
i
)
g(n,j)-\sum_{i=1}^{j-1}f(P_i)
g(n,j)−∑i=1j−1f(Pi)为质数集的大小得到。而合数部分我们可以通过枚举合数最小质因子,通过积性函数相乘获得。
S
(
n
,
j
)
=
g
(
n
,
∣
P
∣
)
−
∑
i
=
1
j
−
1
f
(
P
i
)
+
∑
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)=g(n,|P|)-\sum_{i=1}^{j-1}f(P_i)+\sum_{k=j}^{P_k^2\le n}\sum_{e=1}^{P_k^{e+1}\le n}S(\frac{n}{P_k^e},k+1)\times f(P_k^e)+f(P_k^{e+1})
S(n,j)=g(n,∣P∣)−∑i=1j−1f(Pi)+∑k=jPk2≤n∑e=1Pke+1≤nS(Pken,k+1)×f(Pke)+f(Pke+1)
枚举当中对于合数只有一个质因子的被漏掉了,因此要单独加上。
学习当中的疑惑点
为什么质数的要通过递推求得,不可以直接枚举质数求和吗?
答:例如求1e9内的质数合,如果枚举复杂度就会很高,而通过递推就可以在能接受的时间内获得。
min_25筛的学习笔记
最新推荐文章于 2023-03-17 09:08:31 发布