丑数
丑数
考虑用堆来维护。
每次删去最小值后,插入最小值乘以其他的素数。
考虑去重,根据 \(2\times 3\times 2=2\times 2\times 3\),每次记录某个数上一个数是什么,每次乘的质因数都是按照下标的顺序的。
由于每次插入的数都会比删除的大得多,所以堆的向上调整复杂度很低。
注意用手写堆,STL过慢(O2 MLE)。
代码
更简单的方法:
考虑第 \(i\) 个丑数一定是第 \(k(k<i)\) 个丑数乘以一个质数得到的,且比第 \(i-1\) 个丑数大的最小的丑数。可以迭代 \(n\) 次,每次枚举质数,看每个质数至少需要乘第几个丑数才能达到,然后取最小者。由于丑数单调递增,所以每个质数至少需要乘第几个丑数也单调递增(有点绕),所以所以我们可以开数组表示上次的情况,复杂度玄学,速度飞快。
code
当然可以用平衡树了。