题解链接:**(https://www.cnblogs.com/stelayuri/p/12495726.html)
题目链接:(https://codeforces.com/contest/1325/problem/D)
题意:
给定两个数 u v ,求一个最短的数组
这个数组所有元素按位异或等于 u ,且和为 v
找不到输出 -1
否则输出数组的个数,再输出数组内的正整数
关于异或:
输入 运算符 输入 结果
1 ⊕ 0 1
1 ⊕ 1 0
0 ⊕ 0 0
0 ⊕ 1 1
1.一串数的异或<=和(二进制加法得知,等于的情况出现在多个数的二进制中 1 的位都不相同时)
2.异或值与和的奇偶性相同
如果异或值为奇数,说明被异或的数中一定有奇数个奇数,才会导致最低位为 1
而奇数个奇数与不论多少个偶数相加,和一定也是奇数
所以异或值与和的奇偶性一定相同
#include <iostream>
#include <cstdio>
using namespace std;
#define LL long long
int read()
{
int x = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-') w = -1;
ch = getchar();
}
while(ch <= '9' && ch >= '0')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * w;
}
int main()
{
LL u, v;
cin >> u >> v;
if(u == v)
{
if(u == 0)
{
printf("0\n");
}
else
{
printf("1\n%lld\n", u);
}
return 0;
}
if(u > v)
{
printf("-1\n");
return 0;
}
if(u % 2 != v % 2)
{
printf("-1\n");
return 0;
}
LL x = (v - u) / 2;
LL p = u ^ x;
if(p == u + x)
{
printf("2\n%lld %lld\n", p, x);
return 0;
}
else
{
printf("3\n%lld %lld %lld\n", u, x, x);
return 0;
}
return 0;
}