D. Ehab the Xorcist---------------------------思维

在这里插入图片描述
在这里插入图片描述
题意:
构造一个数组,使得数组元素异或和等于u,数组元素累加之和等于v
问数组长度最短是多少,不存在就输出-1
解析:
一看没什么头绪,只能分类讨论

1.如果u>v 不存在因为u的高位为1,但是v的高位不是1
2. 1) 如果u == v 且 u == 0 或者 v==0 输出 0
2)如果u == v 且 u!=0 且 v!=0 那么u和v任意输出一个即可
3.根据异或的性质
1)相同的数异或为0
2)和0异或的数一定还是本身
因为u^0=u ,且构造长度最短,我们构造一个长度为3的 u,x,x
那么x=(v-u)/2 如果(v-u)是奇数也是不满足条件的输出-1。
4.有可能存在长度为2的情况,怎么去考虑呢,其实就是在长度为3的情况下,把前两个合并变成 (u+v)/2,(v-u)/2 再去判断这种情况满不满足要求。不满足就输出长度为3的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll u,v;
int main()
{
	cin>>u>>v;
	if(u>v) {cout<<"-1"<<endl;}
	else if((v-u)%2) {cout<<"-1"<<endl;}
	else if(u==v&&v==0) {cout<<0<<endl;}
	else if(u==v&&v) {cout<<1<<endl<<v<<endl;}
	else
	{
			ll x=(u+v)/2, y=(v-u)/2;
	if((x^y)==u&&(x+y)==v)
	{
		cout<<2<<endl;
		cout<<x<<" "<<y<<endl;
	}
	else
	{
		cout<<3<<endl;
		cout<<u<<" "<<(v-u)/2<<" "<<(v-u)/2<<endl;
	}
	}

	
	
	
	
 } 
发布了491 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43690454/article/details/104878329
今日推荐