P13034 [GCJ 2021 #1C] Double or NOTing

题目描述

给定一个起始非负整数 $\textbf{S}$ 和一个目标非负整数 $\textbf{E}$。$\textbf{S}$ 和 $\textbf{E}$ 都以二进制形式给出(即以 2 为基数的表示)。你的目标是通过以下两种操作将 $\textbf{S}$ 转换为 $\textbf{E}$: 1. **双倍操作**:将当前值乘以 2。 2. **取反操作**:对当前值进行按位取反。当前值的二进制表示不包含不必要的前导零,且操作后产生的不必要前导零将被移除。(唯一必要的前导零是表示 0 时的那个零)。 例如: - 双倍操作:6 变为 12,0 保持为 0,10 变为 20。 - 取反操作:0 变为 1,1 变为 0,$3 = 11_2$ 变为 0,$14 = 1110_2$ 变为 1,$10 = 1010_2$ 变为 $5 = 101_2$,$5 = 101_2$ 变为 $2 = 10_2$。($X_2$ 表示二进制表示为 $X$ 的整数)。 你可以按任意顺序、任意次数使用这两种操作。例如,可以通过先取反,再两次双倍,最后再取反,将 $\textbf{S} = 10001_2$ 转换为 $\textbf{E} = 111_2$: $$10001_2 \xrightarrow{\text{取反}} 1110_2 \xrightarrow{\times2} 11100_2 \xrightarrow{\times2} 111000_2 \xrightarrow{\text{取反}} 111_2.$$ 你的任务是确定完成转换所需的最少操作次数,或者判定转换**不可能**。

输入格式

输入的第一行是测试用例的数量 $\textbf{T}$。接下来是 $\textbf{T}$ 个测试用例,每个测试用例占一行,包含两个字符串 $\textbf{S}$ 和 $\textbf{E}$,分别表示起始整数和目标整数的二进制形式。

输出格式

对于每个测试用例,输出一行 `Case #x: y`,其中 $x$ 是测试用例编号(从 1 开始),$y$ 是 `IMPOSSIBLE`(如果无法通过操作将 $\textbf{S}$ 转换为 $\textbf{E}$),否则 $y$ 是所需的最少操作次数。

说明/提示

**样例解释** 样例 #1 是题目描述中给出的示例。 以下是样例 #2、#3 和 #4 的可能最优解法: $$1011_2 \xrightarrow{\text{取反}} 100_2 \xrightarrow{\times2} 1000_2 \xrightarrow{\text{取反}} 111_2,$$ $$1010_2 \xrightarrow{\times2} 10100_2 \xrightarrow{\text{取反}} 1011_2,$$ $$0_2 \xrightarrow{\text{取反}} 1_2.$$ 在样例 #5 中,无法通过任何操作序列将 $0_2$ 转换为 $101_2$。 在样例 #6 中,$\textbf{S} = \textbf{E}$,因此无需任何操作。 **数据范围** - $1 \leq \textbf{T} \leq 100$。 - $\textbf{S}$ 的每个字符是 0 或 1。 - $\textbf{S}$ 的首字符可以是 0,仅当 $\textbf{S}$ 的长度为 1 时。 - $\textbf{E}$ 的每个字符是 0 或 1。 - $\textbf{E}$ 的首字符可以是 0,仅当 $\textbf{E}$ 的长度为 1 时。 **测试集 1(14 分,可见判定)** - $1 \leq \text{\textbf{S} 的长度} \leq 8$。 - $1 \leq \text{\textbf{E} 的长度} \leq 8$。 **测试集 2(26 分,隐藏判定)** - $1 \leq \text{\textbf{S} 的长度} \leq 100$。 - $1 \leq \text{\textbf{E} 的长度} \leq 100$。 翻译由 DeepSeek V3 完成