题意:
给出一个
和一个
,要求构造出最短的一个数组,使得所有元素异或的结果为
,所有元素之和的结果为
。
异或可以考虑为不进位的加法。
分类讨论一下:
- 当 和 都为 时,答案为
- 当 时,答案为 或者
- 当 时,答案为
- 两个相同的数异或值肯定为 , 异或任何数又是那个数的本身,所以我们设 然后输出 ,肯定符合。
- 如果 那么肯定是 。
- 还有一种长度为 的情况。 合并变成了 ,这种情况特判即可。
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;
}