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\) 个数并枚举幂集。

posted @ 2025-11-18 20:38  03Goose  阅读(3)  评论(0)    收藏  举报