Min_25筛小记

· · 个人记录

1.质数的 c 次幂前缀和

可以去 P6021 【模板】质数前缀统计 & Loj#6235. 区间质数个数 进行阶段性测试 , My Code

我们考虑借鉴埃式筛法的思想,逐渐使用质数将不合法的数筛去。

设 $p_{\min}(n)$ 为 $n$ 的最小质因子。特殊地,$p_{\min}(1)=+∞$。 设 $S_{n,k}$ 为(埃式筛法)筛除 $p_1\sim p_k$ 的倍数之后 $n$ 以内剩余的数。 即 $S_{n,k}=\big\{x\in N^+\big|\ x\leq n\text{ 且 }p_{\min}(x)>k\big\}

( 注意,S_{n,k} 不包括 p_1\sim p_k ,但包括 1 )

因此,实现埃式筛的时候,只需要利用 \lfloor\sqrt{N}\rfloor 以内的质数来筛除,就能正确地得到 N 以内所有的质数。

\lfloor\sqrt{N}\rfloor 内共有 m 个质数。

令 $h(n,k)=\sum\limits_{x\in S_{n,k}}x^c$ ,即筛除 $k$ 轮之后 $n$ 以内剩余的数的 $c$ 次方和。 那么,$h(N,m)-1+\sum\limits_{p\in P_m}p^c$ 即为答案。 我们以 $k$ **从小到大**的方式,依次筛去“**最小素因子**为 $p_k$ 的数”,注意只筛到 $p_m$ 即可。 设 $D_{n,k}=\big\{x\in N^+\big|\ x\leq n\text{ 且 }p_{\min}(x)=k\big\}$ ,即埃式筛法 $k$ 轮中筛除的数。 按照定义有 $S_{n,k}=S_{n,k-1}-D_{n,k}$。 又能发现,对于 $x\in S_{\lfloor n/p_k\rfloor,k-1}$ 则 $p_k*x$ 最小素因子恰为 $p_k$,即 $p_k*x\in D_{n,k}$。 而且,若 $t\in D_{n,k}$ ,那么 $t/p_k$ 一定 $\in S_{\lfloor n/p_k\rfloor,k-1}$。 这给出一个双射(充要条件),即 $D_{n,k}=p_kS_{\lfloor n/p_k\rfloor,k-1}

综上可得如下关系式 :

\large S_{n,k}=S_{n,k-1}-p_kS_{\lfloor n/p_k\rfloor,k-1}

由此得到 h 的递推式 :

h(n,k)=h(n,k-1)-p_k^ch(\lfloor n/p_k\rfloor,k-1)

边界 : h(n,0)=\sum\limits_{i=1}^ni^c ,可以插值求出。

注意到我们在递推中需要利用 \lfloor n/p_k\rfloor 处的取值。

由整除经典结论,我们只用维护任意的 \lfloor N/d\rfloor 处的答案即可,这一共 O(\sqrt{N}) 个。

接下来我们讨论实现方法。

采用暴力实现,在每个质数处使用上述递推式,复杂度为:

质数个数 O(\frac{\sqrt{N}}{logN}) ,维护的值 O(\sqrt{N}) ,总复杂度为 O(\frac{N}{logN})

p_k>\sqrt{n} 时,可推知 D_{n,k}=\{p_k\} ,于是 S_{n,k}=S_{n,k-1}-\{p_k\}

\Rightarrow S_{n,k}+P_k=S_{n,k-1}+P_{k-1}

不妨令 S'_{n,k}=S_{n,k}+P_k ,h(n,k)=\sum\limits_{i\in S'_{n,k}}i^c

这样,当 p_k>\sqrt{n} 时,S'_{n,k}=S'_{n,k-1} ,无变化。

这样,只有筛 \leq \sqrt{n} 的质数才会影响到 h(n,\_) 的值。

p_k\leq\sqrt{n} 时 , 由 S_{n,k}=S_{n,k-1}-p_kS_{\lfloor n/p_k\rfloor,k-1}

$\Rightarrow S'_{n,k}=S'_{n,k-1}-p_k(S'_{\lfloor n/p_k\rfloor,k-1}-P_{k-1})+\{p_k\}$ (全部改写为 $S'$) 注意到 $S'_{p_{k-1},k-1}=P_{k-1}+1$ ,可替换为 : $\Rightarrow S'_{n,k}=S'_{n,k-1}-p_k(S'_{\lfloor n/p_k\rfloor,k-1}-S'_{p_{k-1},k-1})

这对应下面的递推式 :

h(n,k)=h(n,k-1)-p_k^c\Big(h(\lfloor n/p_k\rfloor,k-1)-h(p_{k-1},k-1)\Big)

最终答案为 h(n,m)-1

O(\frac{\sqrt{n}}{\log n}) 个质数会影响到 h(n,\_) 。取最大的 \sqrt{N}n=\lfloor N/d\rfloor 积分 :

总复杂度 O\bigg(\sum\limits_{d=1}^{\sqrt{N}}\frac{\sqrt{N/d}}{log(N/d)}\bigg)=O(\frac{N^{3/4}}{logN})

该做法实战中最为常用。

后续更优做法可见相关文章②。

2.积性函数求和

我们以 k 从大到小的方式,考虑“最小素因子p_k 的数”。

方便起见,设 S_{n,k} 为最小素因子 \geq p_k 的集合。

仿照前面 h 的求解方法,设 r(n,k)=\sum\limits_{i\in S_{n,k}}^nG(i)

则答案为 r(N,1)

枚举 p_t=p_{\min}(x),再枚举 xp_k 的次数 c ,对于符合该要求的 x 计算贡献。

可得 r(n,k)=\sum\limits_{t=k}^{p_t\leq n}\sum\limits_{c=1}F(p_t^c)r\big(\lfloor x/p_t^c\rfloor,t+1\big)

只需枚举到 $\sqrt{n}$ ,对于 $p_k>\sqrt{n}$ 的情况,符合条件的 $x$ 只有 $p_k$ 本身,可以使用前面求出的素数部分和。 直接暴力搜索,不需要记忆化。 在 $10^{12}$ 内,复杂度可以视为 $O\Big(\frac{N^{3/4}}{\log N}\Big)$ ,证明见 2018 年候选队论文。 - **例题①** : [Loj#6053. 简单的函数](https://loj.ac/problem/6053) 当 $p$ 为奇质数时 $G(p)=p{\ \rm xor\ }1=p-1$。特殊地,$G(2)=3$。 [评测记录](https://loj.ac/submission/991601) - **例题②** : [Uoj#188. 【UR #13】Sanrd](https://uoj.ac/problem/188) 次大质因子貌似和上面提到的积性函数求和没什么关系…… 设 $f(n)$ 为 $n$ 的非严格次大质因子。 设 $r(n,k)$ 为 $\sum\limits_{i\in S_{n,k}}f(i)$。 设 $h[l,r]$ 为 $[l,r]$ 区间内的质数个数。 仍然考虑枚举 $p_t=p_{\min}(x)$,再枚举 $x$ 中 $p_k$ 的次数 $c$ ,对于符合该要求的 $x$ 计算贡献。 分两类讨论 : 若 $x=p_t^{c_1}p_l\ (t\leq l)$ ,则 $f(x)=p_t$ 。 若 $x=p_t^cy$,且 $y$ 的质因子次数 $\geq 2$ 那么 $f(x)=f(y)

可得 r(n,k)=\sum\limits_{t=k}^{p_t\leq n}\sum\limits_{c=1}\Big(r\big(\lfloor x/p_t^c\rfloor,t+1\big)+p_t*h\big[p_t,\lfloor n/p_t^c\rfloor\big]+[c>1]\Big)

由于质数的贡献为 0 ,可以省去第一部分。

评测记录