1 条题解
-
0
题目重述
有两个隐藏的非负整数 和 ()。
我们可以进行 最多 2 次询问,每次询问给出一个整数 (),评测机会返回其中 是按位或运算。
两次询问结束后,评测机会再给出一个整数 (),我们需要输出
关键推导
1. 按位分解
对于二进制第 位(),设 表示该位的值。
的第 位 =
的第 位 =所以该位对 的贡献为:
2. 一次询问
当 时,所有位 ,那么:
因此:
记:
通过第一次询问 得到 。
3. 最终答案公式
对任意 ,我们想求:
按位分解:
第 位贡献:
- 如果 :贡献 =
- 如果 :贡献 = (因为或上 1 必为 1)
因此:
$$\text{ans} = \sum_{k: m_k = 0} (x_k + y_k) 2^k + \sum_{k: m_k = 1} 2 \cdot 2^k $$第二个和 = (因为 )
第一个和 =
记:
则:
4. 如何求 ?
我们需要用第二次询问来求 。
注意到 ,因为:
- 的第 位 =
- 的第 位 =
- 所以 的第 位贡献 = ,求和即 。
5. 第二次询问的选择
如果我们取 (按位取反,即 ,且 ),则:
对于第 位:
- 若 ,则 ,贡献 =
- 若 ,则 ,贡献 =
因此:
$$f(\sim m) = \sum_{k: m_k=0} 2 \cdot 2^k + \sum_{k: m_k=1} (x_k + y_k) 2^k $$第一个和 = ,其中 表示 按位取反(在 位意义下,即 )。
第二个和 = 。
所以:
于是:
6. 最终答案公式
代入 :
$$\text{ans} = 2m + S - [f(\sim m) - 2 \cdot (\sim m)] $$$$\text{ans} = 2m + S - f(\sim m) + 2 \cdot (\sim m) $$因为 ,所以:
$$2m + 2 \cdot (\sim m) = 2(m + \sim m) = 2(2^{30} - 1) = 2^{31} - 2 $$因此:
其中 。
算法步骤
- 第一次询问:输出 ,得到 。
- 等待评测机给出 (在输出
!之后)。 - 第二次询问:输出 (即按位取反),得到 。
- 计算答案:
- 输出 。
注意:第二次询问是在知道 之后进行的,因此仍然在 2 次询问 的限制内。
时间复杂度
每个测试用例 次询问,总复杂度 ,满足 的要求。
示例验证
以题目第一个测试用例为例:。
-
第一次询问 ,得 。
-
收到 ,计算 。
-
第二次询问 ,需要知道 的值。
由于 ,二进制:
- 的二进制:最低位为 0,其余位为 1。
- :最低位 = ,其余位 = (因为 除最低位外全 0),所以 。
- :最低位 = ,其余位 = (因为 只有第 1 位为 1,其余位 0),所以 。
- 和 = 。
-
代入公式:
正确。
- 1
信息
- ID
- 6357
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者