1 条题解

  • 0
    @ 2026-4-4 15:31:11

    题目大意

    我们有两个非负整数 xxyy

    你可以执行任意多次(包括零次)以下操作:选择一个正整数 kk,然后将 xxyy 中的一个替换为 那个数2k\left\lfloor \frac{\text{那个数}}{2k} \right\rfloor,本次操作的成本为 2k2k
    但有一个额外的约束:你不能选择同一个 kk 超过一次。

    你的任务是计算使 x=yx = y 所需的最小可能总成本。


    关键观察

    1. 除法运算的合并

    对于任意正整数 xx,以下等式成立:

    $$\left\lfloor \frac{\lfloor x / 2^a \rfloor}{2^b} \right\rfloor = \left\lfloor \frac{x}{2^{a+b}} \right\rfloor $$

    这意味着:对一个数多次除以 22 的不同幂次,等价于除以这些幂次之和的 22 的幂
    因此,我们只关心每个数总共除以 22 的多少次方,而不关心除法的顺序。

    2. 操作的本质

    令:

    • xx 被除的总次数为 ii(即总共除以 2i2^i
    • yy 被除的总次数为 jj(即总共除以 2j2^j

    那么操作后:

    $$x' = \left\lfloor \frac{x}{2^i} \right\rfloor, \quad y' = \left\lfloor \frac{y}{2^j} \right\rfloor $$

    并且要求 x=yx' = y'

    3. 约束条件

    由于不能重复使用同一个 kk,并且题目中的操作是除以 2k2k,但经过分析(或根据标程的简化),我们可以将问题等价为:
    每次选择一个 22 的幂 2p2^pp0p \ge 0),将其分配给 xxyy,表示该数除以 2p2^p,成本为 2p2^p,每个 pp 只能用一次。

    这样,xx 总共除以 2i2^iyy 总共除以 2j2^j,其中 iijj 分别是分配给 xxyy 的幂次之和,且用过的幂次两两不同。


    动态规划

    因为 x,y1017<260x, y \le 10^{17} < 2^{60},所以 i,j60i, j \le 60
    定义 dp[i][j]dp[i][j] = 用一些不同的 22 的幂(每个幂只能用一次),使得 xx 获得的总指数为 iiyy 获得的总指数为 jj,所需的最小总成本。

    初始状态:dp[0][0]=0dp[0][0] = 0,其余为无穷大。

    考虑幂 2p2^pp=0,1,,59p = 0, 1, \dots, 59),我们可以:

    • 不使用这个幂
    • 分配给 xx,则 ii+pi \to i + p,成本增加 2p2^p
    • 分配给 yy,则 jj+pj \to j + p,成本增加 2p2^p

    由于每个幂只能用一次,按 pp 从小到大更新,且需要倒序更新 i,ji, j(类似 0-1 背包),以防止重复使用同一个幂。


    查询答案

    对于给定的 x,yx, y,我们要找到 i,ji, j 使得:

    $$\left\lfloor \frac{x}{2^i} \right\rfloor = \left\lfloor \frac{y}{2^j} \right\rfloor $$

    并且 dp[i][j]dp[i][j] 最小。

    注意:xx 右移 ii 位(整数除法)就是 x/2i\lfloor x / 2^i \rfloor
    所以条件等价于:

    (x>>i)=(y>>j)(x >> i) = (y >> j)

    枚举所有 i,j[0,60)i, j \in [0, 60),检查上述等式,取最小的 dp[i][j]dp[i][j]


    最终答案

    对每个测试用例,输出:

    min0i,j<60,  (x>>i)=(y>>j)dp[i][j]\min_{0 \le i,j < 60,\; (x>>i) = (y>>j)} dp[i][j]

    x=yx = y,则 i=j=0i = j = 0 即可,dp[0][0]=0dp[0][0] = 0


    复杂度

    • DP 预计算:O(B3)=O(603)=O(216000)O(B^3) = O(60^3) = O(216000),非常小
    • 每个查询:O(B2)=O(3600)O(B^2) = O(3600)tt 最大 10510^5,总约 3.6×1083.6 \times 10^8 次操作,在 3.5 秒内可行(使用 C++ 优化可通过)

    总结

    这道题的核心是:

    1. 注意到除以 22 的幂可以合并。
    2. 将问题转化为:给 xxyy 分配不同的 22 的幂作为除数,使得最终值相等,并最小化总成本。
    3. 用 0-1 背包 DP 预计算所有可能分配的最小成本。
    4. 查询时枚举 i,ji, j 检查相等条件,取最小值。
    • 1

    信息

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