min_25筛的学习笔记

作用
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[iP 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,j1) - ∑ i = 1 j − 1 f ( P i ) ) \sum_{i=1}^{j-1}f(P_i)) i=1j1f(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,j1)g(n,j1)f(Pj)[g(Pjn,j1)i=1j1f(Pi)]Pj2>nPj2n
结合积性函数的性质,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=1j1f(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=1j1f(Pi)+k=jPk2ne=1Pke+1nS(Pken,k+1)×f(Pke)+f(Pke+1)
枚举当中对于合数只有一个质因子的被漏掉了,因此要单独加上。
学习当中的疑惑点
为什么质数的要通过递推求得,不可以直接枚举质数求和吗?
答:例如求1e9内的质数合,如果枚举复杂度就会很高,而通过递推就可以在能接受的时间内获得。

猜你喜欢

转载自blog.csdn.net/weixin_43891021/article/details/108703292