丑数

丑数

考虑用堆来维护。

每次删去最小值后,插入最小值乘以其他的素数。

考虑去重,根据 \(2\times 3\times 2=2\times 2\times 3\),每次记录某个数上一个数是什么,每次乘的质因数都是按照下标的顺序的。

由于每次插入的数都会比删除的大得多,所以堆的向上调整复杂度很低。

注意用手写堆,STL过慢(O2 MLE)。

代码

更简单的方法:

考虑第 \(i\) 个丑数一定是第 \(k(k<i)\) 个丑数乘以一个质数得到的,且比第 \(i-1\) 个丑数大的最小的丑数。可以迭代 \(n\) 次,每次枚举质数,看每个质数至少需要乘第几个丑数才能达到,然后取最小者。由于丑数单调递增,所以每个质数至少需要乘第几个丑数也单调递增(有点绕),所以所以我们可以开数组表示上次的情况,复杂度玄学,速度飞快。

code

当然可以用平衡树了。

posted @ 2023-08-11 08:02  wscqwq  阅读(3)  评论(0编辑  收藏  举报