码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】Ehab the Xorcist

时间:2020-06-13 11:24:53      阅读:526      评论:0      收藏:0      [点我收藏+]

标签:span   输出   col   ==   text   red   turn   奇数   mat   

\(\color{red}{Link}\)

\(\color{blue}{\text{Solution:}}\)

题目要求构造一个最短的序列,使得异或和为\(u\),数列和为\(v\).

那么,因为是异或,所以最终序列的\(u\)对应的二进制位一定出现了奇数次,其他一定是偶数次。

显然\(u,v\)奇偶性不同或是\(u>v\)则无解。异或和显然小于数列和。

\(u=v\)时,输出一个数\(u\)即可。

\(u\not= v\)时,考虑下面情况:

\(\delta=v-u,h=\frac{\delta}{2}\)

\(\text{h&u}=0\)则输出两个数\(h,\text{u^h}\)。因为此时\(\text{u^h}=u+h,u+h+h=u+\delta=v,\text{u^h^h=u}.\)

否则,输出三个数\(h,h,u\)即可。这个显然。且一定不存在两个数的解法。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a[500000],u,v,cnt;

int main(){
	scanf("%lld%lld",&u,&v);
	ll dt=v-u;
	if(u==v&&u==0){
		puts("0");
		return 0;
	}
	if(dt<0||(dt&1)){
		puts("-1");
		return 0;
	}
	else if(dt==0){
		cout<<1<<endl<<u<<endl;
		return 0;
	}
	else{
		long long h=dt>>1;
		if(!(h&u))cout<<2<<endl<<h<<" "<<(h^u)<<endl;
		else cout<<3<<endl<<h<<" "<<h<<" "<<u<<endl;
	}
	return 0;
}

【题解】Ehab the Xorcist

标签:span   输出   col   ==   text   red   turn   奇数   mat   

原文地址:https://www.cnblogs.com/h-lka/p/13111807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!