模拟84 题解
A. Smooth
考虑用已有的光滑数推出新的光滑数。
显然每次可以取出最小的光滑数,并乘每个质因子插入堆中。
需要通过哈希表打标记来解决重复计数的问题。
复杂度为$O(kblogk)$,空间应该也承受不住。
正解显然不带$log$。
因为我们每次取出的都是最小的光滑数,其实堆有些多余。
所以考虑如何来去掉这个堆。
受到蚯蚓一题的启发,因为乘每个质因子的结果是单调递增的。
可以对乘每个质因子的结果开一个队列,每次取出$b$个队列中的最小值。
然而这样还不能去重,我们有更好的方法。
在欧拉筛中,我们使每个合数都被它最小的质因子筛出。
所以可以用相同的思想,当对当前质数取模等于0时跳出,可以做到每个光滑数仅被筛一次。
B. Six
看到这个数据范围,马上想状压。
序列长度最多为12,似乎并不很难做。
然而一些简单的状压都死掉了。
于是自闭了,决定把$3^{2^6}$压进状态。
只会打$cnt<=3$,$cnt=4$ $16$维数组分类讨论了一年,然而并没有过样例。
其实把这个状压改成记忆化搜索就是正解。
因为合法的状态数并不多,可以直接进行记忆化搜索。
用哈希表支持查询某个状态的操作,状态的定义是:
每个不同的因子出现了多少次(0/1/2),
不同的因子指$n$的因子中,质因子集合不同的数。
显然我们只需要维护这些信息就可以确定是否可以最多与不超过一个数不互质。
C. Walker
发现变量其实只有三个。
所以在$n$个行人中随机选$2$个,三角函数大力解出三个变量。
代入$n$个行人的初始位置,检验正确的个数是否合法就完了。