1 条题解
-
0
题目大意
我们有两个非负整数 和 。
你可以执行任意多次(包括零次)以下操作:选择一个正整数 ,然后将 或 中的一个替换为 ,本次操作的成本为 。
但有一个额外的约束:你不能选择同一个 超过一次。你的任务是计算使 所需的最小可能总成本。
关键观察
1. 除法运算的合并
对于任意正整数 ,以下等式成立:
$$\left\lfloor \frac{\lfloor x / 2^a \rfloor}{2^b} \right\rfloor = \left\lfloor \frac{x}{2^{a+b}} \right\rfloor $$这意味着:对一个数多次除以 的不同幂次,等价于除以这些幂次之和的 的幂。
因此,我们只关心每个数总共除以 的多少次方,而不关心除法的顺序。2. 操作的本质
令:
- 被除的总次数为 (即总共除以 )
- 被除的总次数为 (即总共除以 )
那么操作后:
$$x' = \left\lfloor \frac{x}{2^i} \right\rfloor, \quad y' = \left\lfloor \frac{y}{2^j} \right\rfloor $$并且要求 。
3. 约束条件
由于不能重复使用同一个 ,并且题目中的操作是除以 ,但经过分析(或根据标程的简化),我们可以将问题等价为:
每次选择一个 的幂 (),将其分配给 或 ,表示该数除以 ,成本为 ,每个 只能用一次。这样, 总共除以 , 总共除以 ,其中 和 分别是分配给 和 的幂次之和,且用过的幂次两两不同。
动态规划
因为 ,所以 。
定义 = 用一些不同的 的幂(每个幂只能用一次),使得 获得的总指数为 , 获得的总指数为 ,所需的最小总成本。初始状态:,其余为无穷大。
考虑幂 (),我们可以:
- 不使用这个幂
- 分配给 ,则 ,成本增加
- 分配给 ,则 ,成本增加
由于每个幂只能用一次,按 从小到大更新,且需要倒序更新 (类似 0-1 背包),以防止重复使用同一个幂。
查询答案
对于给定的 ,我们要找到 使得:
$$\left\lfloor \frac{x}{2^i} \right\rfloor = \left\lfloor \frac{y}{2^j} \right\rfloor $$并且 最小。
注意: 右移 位(整数除法)就是 。
所以条件等价于:枚举所有 ,检查上述等式,取最小的 。
最终答案
对每个测试用例,输出:
若 ,则 即可,。
复杂度
- DP 预计算:,非常小
- 每个查询:, 最大 ,总约 次操作,在 3.5 秒内可行(使用 C++ 优化可通过)
总结
这道题的核心是:
- 注意到除以 的幂可以合并。
- 将问题转化为:给 和 分配不同的 的幂作为除数,使得最终值相等,并最小化总成本。
- 用 0-1 背包 DP 预计算所有可能分配的最小成本。
- 查询时枚举 检查相等条件,取最小值。
- 1
信息
- ID
- 6353
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者