1 条题解

  • 0
    @ 2026-4-4 16:28:22

    题目重述

    有两个隐藏的非负整数 xxyy0x,y<2300 \le x, y < 2^{30})。
    我们可以进行 最多 2 次询问,每次询问给出一个整数 nn0n<2300 \le n < 2^{30}),评测机会返回

    f(n)=(nx)+(ny)f(n) = (n | x) + (n | y)

    其中 | 是按位或运算。

    两次询问结束后,评测机会再给出一个整数 mm0m<2300 \le m < 2^{30}),我们需要输出

    ans=(mx)+(my)\text{ans} = (m | x) + (m | y)

    关键推导

    1. 按位分解

    对于二进制第 kk 位(k=0,1,,29k = 0, 1, \dots, 29),设 xk,yk,nk{0,1}x_k, y_k, n_k \in \{0,1\} 表示该位的值。

    (nx)(n|x) 的第 kk 位 = nk  xkn_k \ | \ x_k
    (ny)(n|y) 的第 kk 位 = nk  ykn_k \ | \ y_k

    所以该位对 f(n)f(n) 的贡献为:

    ck=(nkxk)+(nkyk){0,1,2}c_k = (n_k | x_k) + (n_k | y_k) \in \{0,1,2\}

    2. 一次询问 n=0n=0

    n=0n=0 时,所有位 nk=0n_k = 0,那么:

    ck=xk+ykc_k = x_k + y_k

    因此:

    f(0)=k=029(xk+yk)2k=x+yf(0) = \sum_{k=0}^{29} (x_k + y_k) 2^k = x + y

    记:

    S=x+yS = x + y

    通过第一次询问 n=0n=0 得到 SS


    3. 最终答案公式

    对任意 mm,我们想求:

    ans=(mx)+(my)\text{ans} = (m|x) + (m|y)

    按位分解:

    kk 位贡献:

    (mkxk)+(mkyk)(m_k | x_k) + (m_k | y_k)
    • 如果 mk=0m_k = 0:贡献 = xk+ykx_k + y_k
    • 如果 mk=1m_k = 1:贡献 = 1+1=21 + 1 = 2(因为或上 1 必为 1)

    因此:

    $$\text{ans} = \sum_{k: m_k = 0} (x_k + y_k) 2^k + \sum_{k: m_k = 1} 2 \cdot 2^k $$

    第二个和 = 2m2 \cdot m(因为 m=k:mk=12km = \sum_{k: m_k=1} 2^k

    第一个和 = Sk:mk=1(xk+yk)2kS - \sum_{k: m_k=1} (x_k + y_k) 2^k

    记:

    T=k:mk=1(xk+yk)2kT = \sum_{k: m_k=1} (x_k + y_k) 2^k

    则:

    ans=2m+ST\text{ans} = 2m + S - T

    4. 如何求 TT

    我们需要用第二次询问来求 TT

    注意到 T=(m&x)+(m&y)T = (m \& x) + (m \& y),因为:

    • (m&x)(m \& x) 的第 kk 位 = mkxkm_k \cdot x_k
    • (m&y)(m \& y) 的第 kk 位 = mkykm_k \cdot y_k
    • 所以 (m&x)+(m&y)(m \& x) + (m \& y) 的第 kk 位贡献 = mk(xk+yk)2km_k (x_k + y_k) 2^k,求和即 TT

    5. 第二次询问的选择

    如果我们取 n=mn = \sim m(按位取反,即 nk=1mkn_k = 1 - m_k,且 0n<2300 \le n < 2^{30}),则:

    对于第 kk 位:

    • mk=0m_k = 0,则 nk=1n_k = 1,贡献 = (1xk)+(1yk)=2(1|x_k)+(1|y_k) = 2
    • mk=1m_k = 1,则 nk=0n_k = 0,贡献 = xk+ykx_k + y_k

    因此:

    $$f(\sim m) = \sum_{k: m_k=0} 2 \cdot 2^k + \sum_{k: m_k=1} (x_k + y_k) 2^k $$

    第一个和 = 2(m)2 \cdot (\sim m),其中 m\sim m 表示 mm 按位取反(在 3030 位意义下,即 m=(2301)m\sim m = (2^{30}-1) - m)。

    第二个和 = TT

    所以:

    f(m)=2(m)+Tf(\sim m) = 2 \cdot (\sim m) + T

    于是:

    T=f(m)2(m)T = f(\sim m) - 2 \cdot (\sim m)

    6. 最终答案公式

    代入 ans=2m+ST\text{ans} = 2m + S - T

    $$\text{ans} = 2m + S - [f(\sim m) - 2 \cdot (\sim m)] $$$$\text{ans} = 2m + S - f(\sim m) + 2 \cdot (\sim m) $$

    因为 m+(m)=2301m + (\sim m) = 2^{30} - 1,所以:

    $$2m + 2 \cdot (\sim m) = 2(m + \sim m) = 2(2^{30} - 1) = 2^{31} - 2 $$

    因此:

    ans=2312+Sf(m)\text{ans} = 2^{31} - 2 + S - f(\sim m)

    其中 2312=21474836462^{31} - 2 = 2147483646


    算法步骤

    1. 第一次询问:输出 00,得到 S=f(0)=x+yS = f(0) = x + y
    2. 等待评测机给出 mm(在输出 ! 之后)。
    3. 第二次询问:输出 n=(2301)mn = (2^{30} - 1) \oplus m(即按位取反),得到 f(m)f(\sim m)
    4. 计算答案
    ans=2147483646+Sf(m)\text{ans} = 2147483646 + S - f(\sim m)
    1. 输出 ans\text{ans}

    注意:第二次询问是在知道 mm 之后进行的,因此仍然在 2 次询问 的限制内。


    时间复杂度

    每个测试用例 O(1)O(1) 次询问,总复杂度 O(t)O(t),满足 t104t \le 10^4 的要求。


    示例验证

    以题目第一个测试用例为例:x=1,y=2,m=1x=1, y=2, m=1

    • 第一次询问 n=0n=0,得 S=1+2=3S = 1+2 = 3

    • 收到 m=1m=1,计算 m=(2301)1=2302\sim m = (2^{30}-1) \oplus 1 = 2^{30}-2

    • 第二次询问 n=2302n = 2^{30}-2,需要知道 f(2302)f(2^{30}-2) 的值。

      由于 x=1,y=2x=1, y=2,二进制:

      • 23022^{30}-2 的二进制:最低位为 0,其余位为 1。
      • (nx)(n|x):最低位 = 01=10|1=1,其余位 = 10=11|0=1(因为 xx 除最低位外全 0),所以 (nx)=2301(n|x) = 2^{30}-1
      • (ny)(n|y):最低位 = 00=00|0=0,其余位 = 11=11|1=1(因为 y=2y=2 只有第 1 位为 1,其余位 0),所以 (ny)=2302(n|y) = 2^{30}-2
      • 和 = (2301)+(2302)=2313(2^{30}-1) + (2^{30}-2) = 2^{31} - 3
    • 代入公式:

    ans=(2312)+3(2313)=4\text{ans} = (2^{31}-2) + 3 - (2^{31}-3) = 4

    正确。

    • 1

    信息

    ID
    6357
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者