Loading

CF1365G Secure Password

\(\mathbf{Part. -1}\)

这是一个交互题。

Ayush 又想出了一个设置密码的新方法。他的锁有 \(n\) 个槽位,每个槽位可以放置任意非负整数。密码 \(P\) 是一个长度为 \(n\) 的整数序列,第 \(i\) 个元素将放入锁的第 \(i\) 个槽位。

为了设置密码,Ayush 构造了一个长度为 \(n\) 的整数数组 \(A\),每个元素都在区间 \([0, 2^{63}-1]\) 内。然后,他将密码 \(P\) 的第 \(i\) 个元素设置为数组中除了 \(A_i\) 以外所有元素的按位或(bitwise OR)。

你需要猜出这个密码。你可以进行查询,每次可以选择数组的一个非空下标子集,询问这些下标对应元素的按位或。你最多可以进行 13 次查询。

\(\mathbf{Part. 0}\)

这里讲一些唐诗做法。

  • \(n\) 次查询:显而易见。
  • \(\log nV\) 次查询:考虑拆位,发现如果对于同位全是 \(0\),则答案全是 \(0\),如果有大于一个 \(1\),则答案全是 \(1\)。于是考虑二分唯一一个是 \(1\) 的位即可。
  • \(\sqrt{n}\) 次查询:考虑分块,首先先查询所有不包含同块的元素,然后再查询所有异块的前缀 \(\text{OR}\) 和后缀 \(\text{OR}\)

上述算法,都是在没有任何转换和观察下凭借硬套想出来的。显然,对这道题完全没有用。虽然这道题没有明显的转化,但是观察角度的转变在有时是很有用的(比如其实上述提到的拆位就是一个很好的观察角度从整体到个体的转变例子)。

\(\mathbf{Part. 1}\)

显然,在想出上述询问次数爆炸的算法后,会发现,题目每个点的密码都是一个询问集合 \(S\) 的并组成的(并是由于 \(\text{OR}\) 有可并性)。

从每次询问的角度观察,会发现这是不是完全不可做阿???那如果从询问的角度不可做,那么可以从每个密码的集合 \(S\) 来考虑。

对于第 \(i\) 个密码组成的询问集合 \(S_i\) 来说,\(a_i\) 显然不能出现在 \(\forall x \in S_i\) 的询问中,但是对于 \(\forall j \neq i\),都必须 \(\exists x \in S_i\),使得 \(a_j\) 在第 \(x\) 次询问中。(性质 \(1\)

既然 \(a_i\) 不能出现在 \(\forall x \in S_i\) 的询问中,那么考虑从 \(a_i\) 的角度观察, \(a_i\) 肯定全部出现在 \(\forall x \notin S_i\) 的询问中是最好的。(性质 \(2\)

因此,我们考虑如果以性质 \(2\) 的方式贪心,问题转化成寻找对于 \(13\) 个数,最大的集合 \(T\) 满足 \(\forall a\in T, b \in T, a \not\subseteq b\)

\(\mathbf{Part. 2}\)

似乎又没思路了?于是我们考虑观察性质。先考虑几种简单的构造方法。

  • 对于 \(13\) 个数,找所有大小为 \(x\) 的子集。共 \(\binom{13}{x}\) 个。
  • 对于 \(13\) 个数,考虑观察二进制位(也就是拆位),对于每个位按照 \(0, 1\) 分组。共需要 \(2 \times \log(n)\) 个集合。

然后你会发现除了这两种,好像真没有显然的构造方法阿!于是对于两种情况:

  • 考虑组合数最大值 \(\binom{13}{6} = 1716 > 1000\),这怎么就对了???于是你做完了这道题。
  • 显然,\(2 \times \log(n) = 20\) 个。不太够。

实际上,数学上可以证明,\(\binom{13}{6}\) 就是最优的方案总数。

posted @ 2025-07-22 20:16  DE_aemmprty  阅读(15)  评论(0)    收藏  举报