模拟22 题解
A. 数论
一条性质: 对于一个不良好的数$x$,$x*p^c$一定不是良好的。
因为那些小于x,并且因数比x多的数,乘上$p^c$仍然更优。
这个性质告诉我们:一个目前认为不优的数,不会贡献出良好的数。
显然最大的质因子不会很大,良好的数也不会很多。
实践得出的结论:即使在k取到233的时候,当n为1e18,良好的数只有四万多个,其中存在的最大的质因子为293。
因此我们得到得到所有良好数的方法:
1.刚开始只认为1是良好的。
2.枚举质因子p,对于目前认为每个良好的数,枚举c,将它乘上$p^c$ $(c>=0)$放在一个数组里。
3.将数组排序。
4.从小到大扫描数组,用堆维护前k+1大约数,将不良好的数过滤掉。
5.认为没有过滤掉的数是良好的。
6.返回步骤2,直到连续几个质因子,无法得到任何一个新的良好的数。
B. 位运算
考场上A掉了,比较简单。
观察题目性质,无需状压,只关注存在几个1。
简单的dp,记录转移的前趋,
通过1的个数构造出一组合法的位运算的解,不断找前趋回溯,构造出可行解。
C. 旅行
码不出来。 (又码出来了)
列出dp式子,简单的换根dp,求出根小于$b[1]$的方案数。
对于根为$b[1]$,用数位dp思想dfs。
尝试填入每个点,动态开点线段树维护一下可以做到$O(nlogn)$