模拟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)$

posted @ 2019-08-15 12:02  skyh  阅读(172)  评论(0编辑  收藏  举报