题意:给你u,v,要你构造一个最短的数组使得数组的各元素异或和为u,总和为v。
思路:
首先考虑几组特殊的情况
u == v == 0返回0即可
u == v != 0 返回u即可
u > v 返回 -1
这都比较简单验证
但凡要构造什么东西的题目都是比较难的。这道题我们可以从异或这个运算出发,有一个很重要的性质就是 a ^ a = 0。这个性质告诉我们为了满足异或和等于u,我们总是可以构造这样的数组出来[a,a,u],这样就满足了异或和等于u。为了满足和为v。因为数组中有了一个u我们还需要(v-u) / 2 = a就可以构造出来了。
也就是返回的数组最长不会超过3,但是我们还需要考虑一下长度为2的数组。也就是说[a,a+u]这样的情况,容易验证a+u能合并当且仅当a & u = 0。这个自己可以去验证一下,例如 5 9 的答案是[2,7]而不是[2,2,5](从二进制合并的角度去考虑),5 13的答案就是[4,4,5]。
注意a = (v - u)/ 2 如果不能整除也是不可行解返回-1.
代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
int main(){
    ll u ,v;cin>>u>>v;
    if(u > v){
        cout<<"-1"<<endl;return 0;
    }
    if(u == v && u != 0){
        cout<<"1"<<endl;
        cout<<u<<endl;
        return 0;
    }
    if(u == v && u == 0){
        cout<<"0"<<endl;return 0;
    }
    if((v-u)%2 == 1){
        cout<<"-1"<<endl;
        return 0;
    }
    ll x = (v - u)/2;
    ll y = (u + v)/2;
    if((x & u) == 0){
        cout<<"2"<<endl;
        cout<<x<<" "<<y<<endl;
        return 0;
    }
    cout<<"3"<<endl;
    cout<<x<<" "<<x<<" "<<u<<endl;
}