题解:翻转

简要题意

给定一个长度为 \(2n-1\),两端均为 1 的 01 交替串。每次操作可以选择一段合法的 01 交替子串将其翻转(0 变 1,1 变 0)。求有多少种合法的长度为 \(k\) 的操作序列,使得经过 \(k\) 次操作后,串中恰好剩下 \(n-k\) 个 1。答案对 \(998244353\) 取模。

注:只要在某一步选择的子串区间不同,即视为不同的方案(即使最终的字符串形态相同)。

\(1\le k\le n\le 10^6\),1s。

题解

有点神秘的组合。

首先因为要操作的是 01 交替子串,所以每次操作最多使 1 的个数减一,又要在 \(k\) 次操作后将 1 的个数变为 \(n-k\),故每次操作一定要减少 1 的个数。所以操作的子串一定形如 \(10101\cdots101\)(1 同时为开头和结尾)的形式。

考虑一次操作会带来怎样的变化。因为原串也是 01 交替子串,故每次操作完,区间左右(如果不是边界)都会出现连续的两个 0,在之后的操作中一定不能再跨过他们。可以发现,操作实际上相当于把他所在的那一段区间分裂成了三段区间。

image

这样做有一个非常好的点:如果最后分出的区间固定,那么实际上操作完的序列也固定了,因为区间外肯定全为 0,而区间内一定是以 1 开头以 1 结尾的 01 交替子串。所以我们考虑区间的分法如何计数。

首先是计算不同的操作相对顺序。考虑第 \(i\) 个操作会在哪个区间里。容易注意到因为每次操作增加 \(2\) 个区间,所以第 \(i\) 次操作之前一定有 \(2i-1\) 个区间可以放。故此时操作数即为 \(1\times3\times\cdots\times(2k-1)=(2k-1)!!\)。

(你可能会问,如果操作有一端在边界,那不就错了吗?实际上,我们可以假设那一端其实增加了一个长度为 \(0\) 的段。你可能又要问了,那长度为 \(0\) 的段如果之后选了不就又错了吗?仔细看,我们发现其实这个操作序列其实是从最终的 \(2k-1\) 个区间反推回来的,这恰好规避了这种情况的发生)

其次是在相对顺序的基础上,不同的区间分法有多少。这就相当于我们要把 \(n-k\) 个 1 全部分配给 \(2k+1\) 个区间(一个区间可以被分配到 0 个),插板法一下就是 \(\binom{n+k}{2k}\)。

故最终答案就是 \(\binom{n+k}{2k}\times(2k-1)!!\)。

posted @ 2026-09-09 19:29  qwertim  阅读(14)  评论(0)    收藏  举报