D. Ehab the Xorcist
time limit per test 1 second memory limit per test 256 megabytes input standard input output standard outputGiven 2 integers uu and vv, find the shortest array such that bitwise-xor of its elements is uu, and the sum of its elements is vv.
InputThe only line contains 2 integers uu and vv (0≤u,v≤1018)(0≤u,v≤1018).
OutputIf there's no array that satisfies the condition, print "-1". Otherwise:
The first line should contain one integer, nn, representing the length of the desired array. The next line should contain nn positive integers, the array itself. If there are multiple possible answers, print any.
Examples input Copy2 4output Copy
2 3 1input Copy
1 3output Copy
3 1 1 1input Copy
8 5output Copy
-1input Copy
0 0output Copy
0Note
In the first sample, 3⊕1=23⊕1=2 and 3+1=43+1=4. There is no valid array of smaller length.
Notice that in the fourth sample the array is empty.
1.一个序列的异或和一定小于等于数值和。
2.一个序列的数值和和异或和奇偶性相同。
a+b=(a⊕b)+2(a∧b)
#include "stdafx.h" #include <iostream> #include <vector> #include <algorithm> #include <string> #include <set> #include <queue> #include <map> #include <sstream> #include <cstdio> #include <cstring> #include <numeric> #include <cmath> #include <iomanip> #include <deque> #include <bitset> //#include <unordered_set> //#include <unordered_map> //#include <bits/stdc++.h> //#include <xfunctional> #define ll long long #define PII pair<int, int> using namespace std; int dir[5][2] = { { 0,1 } ,{ 0,-1 },{ 1,0 },{ -1,0 } ,{ 0,0 } }; const long long INF = 0x7f7f7f7f7f7f7f7f; const int inf = 0x3f3f3f3f; const double pi = 3.14159265358979; const int mod = 1e9 + 7; const int maxn = 2005; //if(x<0 || x>=r || y<0 || y>=c) //1000000000000000000 inline ll read() { ll x = 0; bool f = true; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') f = false; c = getchar(); } while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar(); return f ? x : -x; } int main() { ll u, v; cin >> u >> v; ll d = v - u; if (d < 0 || (d % 2)) { cout << -1 << endl; return 0; } if (!d) { if (!u) cout << 0 << endl; else { cout << 1 << endl; cout << u << endl; } } else { ll h = d >> 1; if ((h&u) == 0) { cout << 2 << endl; cout << h << " " << (h^u) << endl; } else { cout << 3 << endl; cout << h << " " << h << " " << u << endl; } } return 0; }