题意:
给出一个
u
u
u 和一个
v
v
v ,要求构造出最短的一个数组,使得所有元素异或的结果为
u
u
u,所有元素之和的结果为
v
v
v。
异或可以考虑为不进位的加法。
分类讨论一下:
- 当 u u u 和 v v v 都为 0 0 0 时,答案为 0 0 0
- 当 u = v u=v u=v时,答案为 u u u 或者 v v v
- 当 u > v u > v u>v 时,答案为 − 1 -1 −1
- 两个相同的数异或值肯定为 0 0 0 , 0 0 0 异或任何数又是那个数的本身,所以我们设 a = ( v − u ) / 2 a = (v - u) / 2 a=(v−u)/2 然后输出 a , a , u a,a,u a,a,u,肯定符合。
- 如果 ( v − u ) % 2 ! = 0 (v - u) \%2!=0 (v−u)%2!=0 那么肯定是 − 1 -1 −1。
- 还有一种长度为 2 2 2 的情况。 a , a , u a,a,u a,a,u 合并变成了 a , a + u a,a+u a,a+u,这种情况特判即可。
AC代码:
const int N = 2e5 + 10;
ll u, v, x, y, z;
int main()
{
sldd(u, v);
if (u == v && v == 0)
{
puts("0");
return 0;
}
if (u == v)
{
puts("1");
pld(u);
return 0;
}
if (u > v || (v - u) % 2)
{
puts("-1");
return 0;
}
x = (v - u) / 2;
y = (v + u) / 2;
if (x + y == v && (x ^ y) == u)
{
puts("2");
pldd(x, y);
return 0;
}
z = (v - u) / 2;
puts("3");
plddd(z, z, u);
return 0;
}