解题报告-论对“筛”的新理解
解题报告-论对“筛”的新理解
筛,顾名思义,就是在值域内把所有不符合条件的数去掉,得到符合条件的一些数。
我们最常见的埃氏筛,就是通过质数筛去不是质数的数。这给我一个启发:筛就类似于 \(\text{DP}\),数论意义下的父状态只与子状态有关。
既然是 \(\text{DP}\),那么必然分优秀的 \(\text{DP}\) 和不优秀的 \(\text{DP}\)。埃氏筛就很不优秀。用我们动态规划观察题面性质法得到,一个数的状态只能是“是质数”和“不是质数”两种。而在更新的过程中,如果我们通过某些转移把一个数的状态从“是质数”变成了“不是质数”,那我们就完成了一次 \(\texttt{true}\rightarrow \texttt{false}\) 的转变,而根据我们的数论知识和 \(\text{DP}\) 知识,我们可以把“不是质数”这个状态看成一个最优状态,不会再被更新。这就意味着,如果我们想要让 \(\text{DP}\) 最优,那么一个数的状态最多被遍历一次。但是埃氏筛里,很多数的状态都被遍历了不止一次,所以我们认为它是 \(O(n\log \log n)\) 的。
\(\log\) 套 \(\log\),已经很不错了,但是如果正巧碰上我们要卡常,那埃氏筛就应该被无情的刨除。用 \(\text{DP}\) 的思想去看,既然一个数的状态只会被改变一次,那么一个数最好情况下只被遍历一次。既然只被遍历一次,其必然可以去掉一些不必要的遍历,而只剩下 \(O(1)\) 个子状态来更新它。这里我们已经无意间用上了 \(\text{DP}\) 推公式的思想,先设一个较劣状态,然后想怎么去优化它。
要只剩下 \(O(1)\) 个子状态,必然是要找到某个数的特有特征,形成唯一的对应关系,使得在 \(\text{DP}\) 思想下它只会被一种状态遍历和更新。欧拉筛找到的性质跟数 \(x\) 的最小质因子有关。设数 \(x\) 的最小质因子为 \(p\),那么 \(x\) 的状态只会被 \(\frac{x}{p}\) 更新,那么每个数只会被更新 \(1\) 次,所以这个算法是 \(O(n)\) 的。
综上所述,如果我们用 \(\text{DP}\) 中“最优状态”的思想去看 \(\texttt{true-false}\) 筛,那么这个筛中每个数的“最优状态”就是 \(\texttt{false}\),\(\texttt{true}\) 可以变成 \(\texttt{false}\),但是 \(\texttt{false}\) 不能再变了,所以一个数的状态最多转变 \(1\) 次。进一步推广,如果一个数的状态有 \(k\) 种,那么其状态的变化是一个 \(k-1\rightarrow k-2\rightarrow\dots\rightarrow 0\) 的递进关系,且不会由小变大(由优状态变到劣状态),所以一个数的状态最多转变 \(k-1\) 次,所以最优复杂度是 \(O(kn)\) 的。

浙公网安备 33010602011771号