Codeforces 1325D - Ehab the Xorcist

这个题很好啊。。。(算是我很久没活跃思维的复健题了,,,,,)

首先很显然
当 u == v 直接输出 1 u
当 u> v 直接输出-1
u ==v == 0时候,直接输出0

u与v奇偶性不同,直接输出-1
这里要联系后面操作

你容易想起来 :
X x o r X = 0 X xor X = 0

对吧。。。。
然后只要这么来就好了
U x o r X x o r X = u U xor X xor X = u
此时有
X = ( v u ) / 2 X = (v - u)/2
所以此时当u,v奇偶性不同就是无解了好好想一下为什么。。(二进制这里可以自由变换。。。)

但注意到 有长度为2的情况。。。
想一下怎么样能有长度为2的情况
注意原来的式子是

U x o r X x o r X = U U xor X xor X = U
此时x可以跟u合并,或者x可以跟x合并
当x与x合并,发现怎么来都是0
于是考虑U和x合并。。。
U x o r X x o r X = U U xor X xor X = U
U + X + X = V U + X + X = V

然后根据一个性质
就是当u和x二进制位没有相同的时候,异或相当于加法。。。

也就是说
当u和x二进制位没有相同的时候
U x o r X x o r X = U + X x o r X = U U xor X xor X =(U + X) xor X = U

那么此时,就可以缩减为长度2了。。。。。

我好菜啊。。。

我原来还想着。贪心。。。我看一眼C,做不得,单走一个D,,,,还wa6次。。。。

#include<bits/stdc++.h>
using namespace std;

unsigned long long u,v;
int main(){
	cin>>v>>u;	
	if(v == 0 && u == 0){
		cout<<0<<endl;
		exit(0);
	}
	 if(v == u){
	 	cout<<1<<endl;
	 	cout<<v<<endl;
	 	exit(0);
	 }
	 if(v > u || (u%2) != (v%2)){
	 	cout<<-1<<endl;
	 	exit(0);
	 }
	 unsigned long long x = (u - v)/2;
	 if((x ^ v) == x + v){
	 	cout<<2<<endl;
	 	cout<<x + v<<" "<<x<<endl;
		exit(0);
	 }
	cout<<3<<endl;
	cout<<v<<" "<<x<<" "<<x<<endl;
	exit(0);
}
发布了80 篇原创文章 · 获赞 3 · 访问量 1738

猜你喜欢

转载自blog.csdn.net/qq_41567618/article/details/104876710
今日推荐