CF1923F Shrink-Reverse

题目描述

给定一个长度为 $n$ 的二进制字符串 $s$(即由 $n$ 个字符组成,每个字符都是 $0$ 或 $1$)。 我们将 $s$ 看作某个整数的二进制表示,并称该整数为字符串 $s$ 的值。例如,$000$ 的值是 $0$,$01101$ 的值是 $13$,$100000$ 的值是 $32$,以此类推。 你最多可以对 $s$ 执行 $k$ 次操作。每次操作可以是以下两种类型之一: - SWAP:选择 $s$ 中的两个下标 $i < j$,交换 $s_i$ 和 $s_j$; - SHRINK-REVERSE:删除 $s$ 的所有前导零,然后将 $s$ 反转。 例如,对 $000101100$ 执行 SHRINK-REVERSE 操作后,会得到 $001101$。 请问,最多经过 $k$ 次操作后,$s$ 的最小可能值是多少?由于答案可能很大,请输出对 $10^9+7$ 取模的结果。 注意,你需要最小化原始值,而不是最小化取模后的结果。

输入格式

第一行包含两个整数 $n$ 和 $k$($2 \le n \le 5 \times 10^5$,$1 \le k \le n$),分别表示字符串 $s$ 的长度和最多可执行的操作次数。 第二行包含一个长度为 $n$ 的二进制字符串 $s$,仅由 $0$ 和 $1$ 组成。 输入保证 $s$ 至少包含一个 $1$。

输出格式

输出一个整数,表示经过不超过 $k$ 次操作后,$s$ 的最小可能值。由于答案可能很大,请输出对 $10^9+7$ 取模的结果。 注意,你需要最小化原始值,而不是最小化取模后的结果。

说明/提示

在第一个样例中,一种最优策略如下: 1. $10010010 \xrightarrow{\texttt{SWAP}} 00010110$; 2. $00010110 \xrightarrow{\texttt{SWAP}} 00000111$。 $00000111$ 的值为 $7$。 在第二个样例中,一种最优策略如下: 1. $01101000 \xrightarrow{\texttt{SHRINK}} 1101000 \xrightarrow{\texttt{REVERSE}} 0001011$; 2. $0001011 \xrightarrow{\texttt{SWAP}} 0000111$。 $0000111$ 的值为 $7$。 由 ChatGPT 4.1 翻译