Codeforces1325D Ehab the Xorcist

Description

link

给定整数 u , v

求一个长度最小的数组 a

使得 a=v 同时 xor a=u

输出两行,第一行为长度,第二行为数组中的值

Solution

首先考虑无解的情况,如果在比较高的位置上数的 xor1 而和为 0 ,显然无解

所以 u>v 时无解

然后对位考虑,如果二进制最后一位的值不一样,显然无解(没有可以进位啥的)

(这里就保证 uv 的奇偶性相同了吧)

然后是 u=v 的情形,这里特判一下 u=0 ,只要一行,剩下的输 u

首先一波操作:

x=(vu)>>1

有一种方案是 [x,x,u](挺神奇)

这是当下最小的情况

之后就是考虑两个数满足条件的构造了

这里有一个比较神的性质(可能是蒟蒻不知)

a+b =a xor b+2×(a and b)

(证明分类讨论一下就可以)

我们发现如果满足a+b=v 同时a xor b=u

a and b=x

再次对位考虑,如果x的某一位为1,那么 a,b 同时为 1xor0

否则对于 xor 没有限制(a,b (1,0)(0,0)会有不同的xor结果)

所以我们看u and x 的值

如果大于 0 就不满足

否则就有一组解为 [x,u+x]

Code

signed main()
{
	int u=read(),v=read();
	if(u>v||(u&1)!=(v&1)) return puts("-1"),0;
	if(u==v){
		if(!u) puts("0");
		else printf("%lld\n%lld\n",1ll,u);
		return 0;
	}
	int x=(v-u)>>1;
	if(x&u) printf("3\n%lld %lld %lld",x,x,u);
	else printf("2\n%lld %lld\n",x,x^u);
	return 0;
}
posted @   没学完四大礼包不改名  阅读(210)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示