用途
设f(x)f(x)f(x)是一个积性函数,min_25筛可以在O(n34logn)O(\frac{n^{\frac{3}{4}}}{\log n})O(lognn43)内求f(x)f(x)f(x)的前缀和:∑i=1Nf(i)\sum_{i=1}^{N}f(i)∑i=1Nf(i)
使用要求:f(p),f(pk)f(p),f(p^k)f(p),f(pk)的值可以快速求出(p∈Prime)(p\in Prime)(p∈Prime)
算法
Step 1:求∑i=1n[i∈Prime]f(i)\sum_{i=1}^{n}[i\in Prime]f(i)∑i=1n[i∈Prime]f(i)
约定PPP表示质数集合,PiP_iPi表示第iii个质数
首先我们要根据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=1nF(i)[i∈Pori的最小质因数>Pj]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=1n[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∣是PPP集合的大小)
考虑ggg的转移:
-
若Pj2>nP_j^2>nPj2>n:
显然不会产生新的贡献了,此时有g(n,j)=g(n,j−1)g(n,j)=g(n,j−1)g(n,j)=g(n,j−1) -
若Pj2≤nP_j^2\leq nPj2≤n:
g(n,j)=g(n,j−1)−∑[i的最小质因数=Pj]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(Pj)∑[i的最小质因数=Pj]F(iPj)=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(Pj)∑k=Pj⌊nPj⌋[k的最小质因数>Pj−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(Pj)[g(⌊nPj⌋,j−1)−g(Pj−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)]
关于ggg的初值:
考虑一下ggg的实际含义是什么呢?可以参考一下埃氏筛法的运行过程。
假设现在有nnn个数依次排开,第iii个数是f(i)f(i)f(i),根据埃氏筛法的那套理论,每次选出一个质数ppp,然后筛掉所有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)就是运行jjj次埃氏筛法后,没被筛掉的所有数之和。
这里递推的起点是g(n,0)g(n,0)g(n,0),g(n,0)g(n,0)g(n,0)的含义是把所有的数字当作质数,然后求∑i=1nF(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=1nf(i)[i∈Pori的最小质因数>Pj]\sum_{i=1}^nf(i)[i\in P\ \ or \ \ i的最小质因数>P_j ]∑i=1nf(i)[i∈P or i的最小质因数>Pj],
∑i=1n[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∣)
编码细节:
- 转移ggg只需用到N\sqrt NN以内的质数,先线性筛预处理出这些质数
- ggg只需要开第一维
- 题目中的NNN往往很大,nnn直接枚举的话会炸掉。所以要预处理一个集合S={⌊Nx⌋∣x∈[1,N]}S=\{\lfloor\frac{N}{x}\rfloor|x\in[1,N]\}S={⌊xN⌋∣x∈[1,N]},集合SSS的大小∣S∣=2N|S|=2\sqrt N∣S∣=2N。递推式中,⌊nPj⌋\lfloor\frac{n}{P_j}\rfloor⌊Pjn⌋一定∈S\in S∈S,因为Pj≤NP_j\leq \sqrt NPj≤N,,而所有≤N\leq\sqrt N≤N的数都可以通过⌊Nx⌋\lfloor\frac{N}{x}\rfloor⌊xN⌋得到,所以Pj−1∈SP_j-1\in SPj−1∈S。在具体实现时,先把SSS离散化一下,调用ggg的第一维时,直接枚举离散化后SSS中各元素的编号。
Step 2:求最终答案
设S(n,j)=∑i=1nf(i)[i的最小质因数>=Pj]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)
考虑SSS的转移:
-
算1~n中质数的贡献:
S(n,j)+=g(n,j)−∑i=1j−1f(Pi)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=1j−1f(Pi)=g(Pj−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=jPk2≤n∑e=1Pke+1≤nS(nPke,k+1)×f(Pke)+f(Pke+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)
(枚举合数的最小质因数及其最小质因数的指数)
边界条件:
if(n<=1∣∣Pj>n)return0;if(n<=1||P_j>n)\ return\ 0;if(n<=1∣∣Pj>n) return 0;
编码细节:
- 同上,ggg的第一维用离散化后SSS中各元素的编号表示
参考博客:
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