D. Ehab the Xorcist

Link: D. Ehab the Xorcist

Description

Given integers and , find the shortest array such that bitwise-xor of its elements is , and the sum of its elements is .

Input
The only line contains integers and ().

Output
If there's no array that satisfies the condition, print "". Otherwise:

The first line should contain one integer, , representing the length of the desired array. The next line should contain n positive integers, the array itself. If there are multiple possible answers, print any.

Examples
input
2 4
output
2
3 1
input
1 3
output
3
1 1 1
input
8 5
output
-1
input
0 0
output
0
Note
In the first sample, and . There is no valid array of smaller length.

Notice that in the fourth sample the array is empty.

Problem solving

这道题的意思就是给你两个数,,让你求一个最短的序列,满足序列中所有元素的异或和为,所有的元素和为,如果系列不存在就输出
分情况讨论

  • 首先我们可以发现,如果,答案不存在。我们按照二进制位来看,如果异或和中的某高位为但是数值和小于,也就是说肯定没有一个属可以让异或和的那个高位上为,所以此时答案不存在
  • 然后我们知道,如果的奇偶性各不相同,答案不存在。因为奇偶性只看最后一位,这时和异或正好是同步的。
  • 然后我们考虑的情况,如果此时,那么输出,否则,答案就是。因为相等,序列中只有一个数,数值和与异或和均为它本身。所以与v也相等。
  • 如果,我们让,那么此时的答案序列就是,因为相等的数异或为根任何数异或都为,所以异或和为u,数值和为。所以答案序列的长度最长为
  • 我们考虑序列长度为2的时候,设序列为,则,此时&。所以我们发现上面我们定义的正好等于&。如果的某一位为,那么的这一位一定也是,那此时的这一位为0,所以如果这一位为得时候,序列长度为2得时候显然不可以。(判断的话直接判断&是否为即可)。如果&,那么我们可以得到,所以答案序列可以写成长度为2的

看了题解勉强可以看懂,但是自己想真的是想不起来2333。菜是原罪。

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ios::sync_with_stdio(0);
    ll u,v;
    cin>>u>>v;
    if(u>v||(u&1)!=(v&1)){
        puts("-1");
        return 0;
    }
    if(u==v){
        if(u==0){
            cout<<"0\n";
        }else{
            cout<<"1\n"<<u<<endl;
        }
        return 0;
    }
    ll x=(v-u)/2;
    if(x&u){
        cout<<"3\n"<<u<<" "<<x<<" "<<x;
    }else{
        cout<<"2\n"<<(u^x)<<" "<<x;
    }
    return 0;
}