Codeforces Round #628 (Div. 2) D. Ehab the Xorcist

D. Ehab the Xorcist

题目链接-D. Ehab the Xorcist
在这里插入图片描述
在这里插入图片描述
题目大意
给定两个数字 u 和 v ,构造一个最短的序列a满足a1⊕a2⊕…⊕an=u 并且 a1+a2+…+an=v

解题思路
需要特判的情况:

  1. u>v:不存在
  2. u,v奇偶性不同:不存在
  3. u=v=0:直接输出0
  4. 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;
}

发布了123 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104872593