Min_25筛简介
$\text{min_25}$筛是一种处理一类积性函数前缀和的算法。
其中这类函数$f(x)$要满足$\sum_{i=1}^{n}[i\in prime]\cdot f(i)$可以被$\sum_{i=1}^{n}[i\in prime]\cdot i^k$简单表示或者快速计算,其中$k$为较小的常数。
时间复杂度好像是$O(\frac{n^{0.75}}{\log n})$,不过据说被证伪了…也有人说是$O(n^{1-\epsilon})$,反正可以做$n=1e10$,貌似跑的比杜教筛快。
空间复杂度$O(\sqrt{n})$。
part 1
首先我们要处理的问题是$\sum_{i=1}^{n}[i\in prime]\cdot f(i)$,由于函数特性转化为了求$\sum_{i=1}^{n}[i\in prime]\cdot i^k$。
设$g(n,i)=\sum_{i=1}^{n}[i\in prime\ or \ t(i)>p_i]\cdot i^k$,其中$t(x)$表示$x$的最小质因子,$p_i$表示第$i$个质数。
直观理解就是埃拉托斯特尼筛法进行了$i$轮之后$1\sim n$剩下的数的$k$次方之和。
显然当$p_i^2>n$时$g(n,i)=g(n,i-1)$,下面只考虑$p_i^2\leqslant n$。
我们考虑$g(n,i)$如何从$g(*,i-1)$转移过来,也就是考虑第$i$轮筛掉了那些数。
那么可以得到式子:
其中$s_i=\sum_{j=1}^{i}p_i^k$。
解释一下这个式子,我们考虑筛掉了哪些数,然后减掉就好了,筛掉的那些数最小的质因子显然是$p_i$,而正好$g(\lfloor\frac{n}{p_i}\rfloor,i-1)$代表最小质因子$\geqslant p_i$的数以及质数,我们把质数减掉,拼起来就是$1\sim n$。
那么写在一起就是:
根据常识可以知道第一维只有$2\sqrt n$个取值,离散化一下然后递推就好了。
注意到这里我们顺便求出了对于每个$x$,$\sum_{i=1}^{\lfloor n/x\rfloor}[i\in prime]\cdot i^k$的值。
part 2
我们想算出$f$的前缀和,同样的我们设$h(n,i)$如下:
那么$h(n,1)+f(1)$就是答案,注意我们$h$不会把$1$算进去。
首先还是很显然的,当$p_i>n$时,$h(n,i)=0$,同样下面只考虑$p_i\leqslant n$的情况。
我们可以通过$g$很简单的算出质数的贡献,即:
这些都可以预处理。
然后我们考虑暴力地枚举最小的质因子是多少以及用了多少个,即:
解释下后面的$f(p_j^{k+1})$,这是因为$h$没有把$1$算进去,所以会漏算质数的次幂,直接加上就行了。
综合起来就是:
写成这样求和符号好像有点丑…不管它
直接暴力递归算就好了,递推好像还慢些。
code
$f(p)=p-1$,$p=2$的情况特殊处理下就好了。
1 |
|
这和上题也是一样的,注意别爆$\text{long long}$。
1 |
|