AT_arc141_d题解报告
这是五年级彩笔账号解封后的第一篇题解,勿喷(如果你没有学过集合的话建议出门右转 oi-wiki)。
\(\text{part.1 题意}\)
有一个值域 \(1\sim 2\times m\),大小为 \(n\) 的集合 \(A\)。求对于集合中的第 \(i\) 个数,求它是否在 \(\sim 2\times m\) 的“好的”子集中。一个集合是好的当且仅当集合内的任意两个整数都不满足整除关系。
\(\text{part.2 抽屉原理}\)
在小奥中,我们知道 \(\{1,2\cdots 2\times m\}\) 的“好的”子集的长度不超过 \(m\),论证也很简单。我们考虑构造 \(m\) 个集合,第 \(i\) 个集合为 \(\{(2i-1)\times2^k\mid 0\le k\wedge(2i-1)\times2^k\le 2\times m\}\)。如果你没看懂上面的表述,当 \(m=5\) 的时候,五个集合形如:
那么很容易发现,每个集合中的任意两个数满足整除关系,而且这些集合不重叠并包含 \(1\sim2\times m\)。所以 \(\{1,2\cdots 2\times m\}\) 中“好的”子集一定来自于上面划分的不同集合,因此子集的长度不超过 \(m\)。那么这样划分是不是对这道题有用呢?
\(\text{part.3 深挖性质}\)
我们发现,如果随便取 \(m\) 个集合内的数,也会发生整除的情况,例如 \(3\times2^3\mid9\times2^4\)。但是预防着一点很简单,只要保证当 \(a\mid b\) 的时候,\(a\) 所对应的 \(2\) 的指数比 \(b\) 所对应的 \(2\) 的指数大即可。所以说,对于每个 \(A\) 中的元素 \(A_i\),它所对应的 \(2\) 的指数一定是有上下界的,它的下界由它的倍数的下界决定。它的上界由它的因数的上节决定,所以 ——DP!
\(\text{part.4 DP}\)
我们设 \(dp_{i,0/1}\) 表示 \(i\) 对应的 \(2\) 的指数的上 / 下界,就有:
判断 \(A_i\) 是否在子集中也很简单,判断 \(dp_{A_i,0}\le v_2(A_i)\le dp_{A_i,1}\) 即可。但是……
我们发现,对于不在 \(A\) 内的转移是无效的,所以我们可以将不在 \(A\) 内的 \(dp\) 的选择变得“没那么优”。具体来说,就是让 \(dp_{?,0}\) 变小,\(dp_{?,1}\) 变大,采用 lower_bound 实现。那么就做完了。
代码就不贴了,自行实现。