CF628 D. Ehab the Xorcist(思维+xor)
仔细思考应该可以AC的。哎。
本来已经在往哪方面想了。
首先,u,v奇偶性不同是不存在的,u>v也是。
u==v,若都为0,则为空数组。否则,为u.
然后三个数就是最大的了。
令u,x,x x = (v-u)/2;符合题意。
现在就是要找是否存在两个数的情况,假设存在
则 a+b=a^b+2(a&b) ,很明显。a^b=u,令a&b=x;
则x&u==0,若满足,则答案为u+x,x;
否则数组长度为3,答案为u,x,x;
这一场不该啊。。。
#pragma GCC optimize(3 , "Ofast" , "inline")
#include <bits/stdc++.h>
#define rep(i , a , b) for(register int i=(a);i<=(b);i++)
#define per(i , a , b) for(register int i=(a);i>=(b);i--)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int , int> pi;
template<class T>
inline void read (T &x) {
x = 0;
int sign = 1;
char c = getchar ();
while (c < '0' || c > '9') {
if ( c == '-' ) sign = - 1;
c = getchar ();
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar ();
}
x = x * sign;
}
const int maxn = 1e6 + 10;
const int inf = int (1e9);
const ll INF = ll (1e18);
const double PI = acos (- 1);
const int mod = 1e9+7;
const double eps = 1e-8;
ll u,v;
int main () {
read (u);
read (v);
if(u>v||u%2!=v%2) {
puts ("-1");
return 0;
}
if(u==v) {
if(u==v&&v==0) {
puts ("0");
return 0;
}
else {
puts ("1");
printf ("%lld\n",u);
}
return 0;
}
ll x = (v-u)/2;
if(x&u) {
puts ("3");
printf ("%lld %lld %lld\n",u,x,x);
}
else {
puts ("2");
printf ("%lld %lld\n",u+x,x);
}
return 0;
}