Codeforces 1325D - Ehab the Xorcist

4 篇文章 0 订阅

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

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

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

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

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

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

U x o r X x o r X = U U xor X xor X = U UxorXxorX=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 UxorXxorX=U
U + X + X = V 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 UxorXxorX=U+XxorX=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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值