题意:
给两个整数u,v,构造一个数组,使得数组的异或和等于u,数组的和等于v
要求构造的数组尽可能的短
思路:
对于每种情况讨论输出即可,注意几种情况的特判
看代码应该能明白
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
#include <stack>
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
typedef long long ll;
using namespace std;
const int MAXN=1e5+50;
const int inf=0x3f3f3f3f;
const int M=5000*4;
int a[MAXN];
struct sa{
int x;
int pos;
}p[MAXN],v[MAXN];
int cmp(sa a,sa b){
return a.x>b.x;
}
int ans[MAXN];
int main()
{
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
ll u,v;
cin>>u>>v;
if(u==0&&v==0){
cout<<0<<endl;
return 0;
}
if(u==v){
cout<<1<<endl;
cout<<u<<endl;
return 0;
}
if(u>v||(v-u)%2==1){//异或和大于和,或者两数的差为奇数,就写不出u,t,t这种形式
cout<<-1<<endl;
return 0;
}
//一定可以满足,u,t,t一定满足题意,但要求数组尽可能短,看两个是否满足即可
//数组为2,满足题意就是(u^t)=u+t,或者直接判断((u+t)^t)==u就行
ll t=(v-u)/2;
if(((u+t)^t)==u){
cout<<2<<endl;
cout<<u+t<<" "<<t<<endl;
}else{
cout<<3<<endl;
cout<<u<<" "<<t<<" "<<t<<endl;
}
return 0;
}
/*
*/