1 条题解
-
0
题目详解
问题重述
我们需要构造一个长度为 的比特串(仅含 和 ),要求:
- 字符串中恰好包含 个 。
- 字符串中作为子序列出现的 的数量等于 的数量。
关键观察
直接计算任意字符串中 和 子序列的数量是很困难的。
但如果我们能构造出使得这两类子序列数量都为 的字符串,问题就变得非常简单。
什么时候 和 子序列数量都为 ?
一个充分条件是:字符串中所有的 都出现在所有的 之前。
$$\underbrace{111\ldots 1}_{k\text{个}} \underbrace{000\ldots 0}_{n-k\text{个}} $$
也就是说,字符串形如:- 要形成 子序列,需要 后面出现 ,然后后面再出现 。
但如果所有 都在所有 的前面,那么一旦出现 ,后面就再也不会出现 ,因此不可能有 。 - 同理,要形成 子序列,需要 后面出现 ,然后后面再出现 。
但在这种结构中, 后面不会再有 ,所以 也不可能出现。
因此,这种字符串的 和 子序列数量均为 ,显然是“完美”的。
直接构造
按照上面的想法,我们可以直接构造:
- 输出 个 ,再输出 个 。
但注意题目要求恰好 个 。这样构造确实满足要求。
然而,看看题目给的示例输出:
- 当 ,输出是 ,而不是 。
这说明题目允许其他构造,但我们的构造 也是正确的。
实际上, 中 和 子序列数量确实都是 。
那么为什么示例没有用这种最简单的构造?可能是因为题目希望展示不同构造方式,但不代表我们的构造错误。
更严谨的构造(与标程一致)
标程给出了一种略微不同的构造,特别处理了 和 的情况,以及一般情况:
- 若 :全为 。
- 若 :全为 。
- 否则,构造为:
个 ,接着 个 ,最后 个 。
这种构造也能保证 和 子序列数量为 ,因为唯一的两个 在两端,中间全是 ,不会出现 在 之后又出现 的模式。
为什么示例输出不同?
题目说“如果有多个解,输出任意一个”。
示例输出 也是一种解,它的 和 子序列数量都是 ,不是 ,但依然相等。我们的构造 也是正确的,而且更简单。
最终结论
最简单且正确的构造是:
$$\text{ans} = \underbrace{111\ldots 1}_{k\text{个}} \underbrace{000\ldots 0}_{n-k\text{个}} $$这保证了 和 子序列的数量均为 ,因此完美满足要求。
如果 或 ,这个构造自然退化到全 或全 。
- 1
信息
- ID
- 6623
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者