题意:
寻找异或后值为 u,相加后和为 v 的最短数组。
思路:
异或得 u ,则 v 至少应大于等于 u ,且多出来的部分可以等分为两份相消。
即初始数组为 u , (v-u)/2 , (v-u)/2,之后即为特判或判断是否可以合并。
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll u,v;cin>>u>>v; ll a=(v-u)/2; if(v<u||(v-u)%2) cout<<"-1"; else if(u==0) cout<<"0"; else if((u+a+a)==u) cout<<"1"<<' '<<u; else if(((u+a)^a)==u)//不会有(u^(a+a))==u,因为此时a+a!=0 cout<<"2"<<' '<<u+a<<' '<<a; else cout<<"3"<<' '<<u<<' '<<a<<' '<<a; return 0; }