A. Add or XOR

问题描述

给定两个非负整数 aabb。你可以对 aa 进行两种类型的操作,任意次数,任意顺序:

  1. aa+1a \leftarrow a + 1。此操作的成本为 xx
  2. aa1a \leftarrow a \oplus 1,其中 \oplus 表示按位异或操作。此操作的成本为 yy

现在要求你使 a=ba = b。如果可能,输出最小成本;否则,报告不可能。

输入

每个测试包含多个测试用例。第一行包含测试用例的数量 tt (1t1041 \leq t \leq 10^4)。接下来是测试用例的描述。

每个测试用例的唯一一行包含四个整数 a,b,x,ya, b, x, y (1a,b100,1x,y1071 \leq a, b \leq 100, 1 \leq x, y \leq 10^7) — 给定的两个整数以及两种操作的相应成本。

输出

对于每个测试用例,输出一个整数 — 使 a=ba = b 的最小成本,如果不可能则输出 1-1

题解

第二种操作(与1进行异或)当 aa 是偶数时会使 aa 的值增加1,当 aa 是奇数时会使 aa 的值减少1。

我们只能在 aba \leq b 的情况下从 aa 到达 bb,因为两种操作都只能增加 aa(除了当 aa 是奇数时与1进行异或,这会使 aa 减少1)。

策略如下:

  • 如果 a=b+1a = b + 1aa 是奇数,我们可以通过一次异或操作到达 bb,成本为 yy
  • 如果 a=ba = b,不需要操作,所以返回 00
  • 如果 a<ba < b,我们需要将 aa 增加 (ba)(b - a) 个单位。
  • 否则我们无法从 aa 到达 bb,所以返回 -1

对于每个单位的增加,我们可以:

  1. 使用操作1(加1),成本为 xx
  2. aa 是偶数时,使用操作2(与1进行异或),成本为 yy

由于数据量很小,我们可以直接将 aa 逐一增加直到达到 bb,并相应地计算成本。

但实际上,成本可以直接计算:

  • 如果 xyx \leq y,总是使用操作1(加1)从 aa 到达 bb,成本为 (ba)x(b - a) \cdot x
  • 否则,成本 =(ba)÷2(x+y)= (b - a) \div 2 \cdot (x + y),如果 (ba)(b - a) 是奇数,我们还需要一次类型1或类型2的操作。

提交链接