D. Ehab the Xorcist
题目链接-D. Ehab the Xorcist
题目大意
给定两个数字 u 和 v ,构造一个最短的序列a满足a1⊕a2⊕…⊕an=u 并且 a1+a2+…+an=v
解题思路
需要特判的情况:
- u>v:不存在
- u,v奇偶性不同:不存在
- u=v=0:直接输出0
- u=v≠0:序列元素个数为1 元素为u
除去这些需要特判的情况,该题就转化为v−u为偶数时的问题,因为v−u为偶数,所以我们能得出序列a的大小最大3
- 所以我们可以构造一个长度为3的序列{u,x,x},满足异或值为u且u+x+x=v,x=(v-u)/2
- 但是还要看先看一下能否构造长度为 2 的序列{u+x,x},使得(u+x)^x=u且u+x+x=v
- 具体操作见代码
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int u,v;
cin>>u>>v;
if(u>v||((v-u)&1)){
cout<<-1;
return 0;
}
if(u==v){
if(u==0) cout<<0;
else cout<<1<<endl<<u;
}
else if(((u+(v-u)/2)^((v-u)/2))==u)
cout<<2<<endl<<u+(v-u)/2<<" "<<(v-u)/2;
else
cout<<3<<endl<<u<<" "<<(v-u)/2<<" "<<(v-u)/2;
return 0;
}