2025/11/18 分享
日常身体差,今天分享的东西会很简单。
一个很有意思的小游戏。
给 \(n\) 个数 \(a_1, a_2, \cdots, a_n\) 满足 \(1 \leq a_i \leq m\) 。要求从中选出两个和相等的无交子集。
考虑随机选 \(n\) 排列的 \(q\) 子排列 \(p_1, p_2, \cdots, p_q\) ,对应 \(a_{p_1}, a_{p_2}, \cdots, a_{p_q}\) 。
这 \(q\) 个数的幂集大小是 \(2^{q}\) 个,取值范围是 \([q, mq]\) 。
由鸽笼原理,若 \(2^{q} > mq - q + 1\) 则存在两个集合相等,只需 \(q > \lfloor \log_{2} (mq - q + 1) \rfloor\) 。
这里右边的指数函数会很快越过左边的线性函数,比如 \(m = 10^{5}\) 则只需 \(q > 21\) 。
那么存在枚举幂集的暴力算法找到两个和相等的不同子集,对于重合部分做删除则得到两个和相等的无交子集。
时间复杂度与 \(n\) 无关,我们只需随机 \(q\) 个数并枚举幂集。
——永远是挑战而不是练习,下次一定更好。
浙公网安备 33010602011771号