#P12727. [GCJ 2021 #1C] Double or NOTing
[GCJ 2021 #1C] Double or NOTing
题目描述
给定一个起始非负整数 和一个目标非负整数 。 和 都以二进制形式给出(即以 2 为基数的表示)。你的目标是通过以下两种操作将 转换为 :
- 双倍操作:将当前值乘以 2。
- 取反操作:对当前值进行按位取反。当前值的二进制表示不包含不必要的前导零,且操作后产生的不必要前导零将被移除。(唯一必要的前导零是表示 0 时的那个零)。
例如:
- 双倍操作:6 变为 12,0 保持为 0,10 变为 20。
- 取反操作:0 变为 1,1 变为 0, 变为 0, 变为 1, 变为 , 变为 。( 表示二进制表示为 的整数)。
你可以按任意顺序、任意次数使用这两种操作。例如,可以通过先取反,再两次双倍,最后再取反,将 转换为 :
$$10001_2 \xrightarrow{\text{取反}} 1110_2 \xrightarrow{\times2} 11100_2 \xrightarrow{\times2} 111000_2 \xrightarrow{\text{取反}} 111_2. $$你的任务是确定完成转换所需的最少操作次数,或者判定转换不可能。
输入格式
输入的第一行是测试用例的数量 。接下来是 个测试用例,每个测试用例占一行,包含两个字符串 和 ,分别表示起始整数和目标整数的二进制形式。
输出格式
对于每个测试用例,输出一行 Case #x: y
,其中 是测试用例编号(从 1 开始), 是 IMPOSSIBLE
(如果无法通过操作将 转换为 ),否则 是所需的最少操作次数。
输入输出样例 #1
输入 #1
6
10001 111
1011 111
1010 1011
0 1
0 101
1101011 1101011
输出 #1
Case #1: 4
Case #2: 3
Case #3: 2
Case #4: 1
Case #5: IMPOSSIBLE
Case #6: 0
说明/提示
样例解释
样例 #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, $$在样例 #5 中,无法通过任何操作序列将 转换为 。
在样例 #6 中,,因此无需任何操作。
数据范围
- 。
- 的每个字符是 0 或 1。
- 的首字符可以是 0,仅当 的长度为 1 时。
- 的每个字符是 0 或 1。
- 的首字符可以是 0,仅当 的长度为 1 时。
测试集 1(14 分,可见判定)
- 。
- 。
测试集 2(26 分,隐藏判定)
- 。
- 。
翻译由 DeepSeek V3 完成