codeforces 628 div2 ——D

首先我们要知道一个公式:a+b = a xor b + (a and b)<<1
这是为什么呢?我们手动模拟一下可以发现,异或相当于不进位加法,而与运算就相当于进位运算,所以把进位加到下一位再加上本位就是a+b了。
这个有什么用呢?
我们可以从公式推导出,若v<u,则必定-1。
那v==u,那就直接特判好了,非常简单。
当v>u,那我们分几种情况。
我们构造三个数,u,x,x,x=(v-u)/2,这样能保证满足构造的东西满足题目要求,所以当v-u是奇数,立刻-1。那我们是否能让数列变得更短呢?我们可以发现,当(u+x)=(u xor x)时,两个数可以合并为一个,这样就可以构造一个更短的序列。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<stack>
#include<utility>
#define int long long
using namespace std;
int u,v;
signed main()
{
	cin>>u>>v;
	if(v<u)
	{
		printf("-1");
	}
	else if(u==v)
	{
		if(u==0)printf("0");
		else printf("1\n%lld",u);
	}
	else
	{
		if((v-u)%2==1)printf("-1");
		else
		{
			int x=(v-u)/2;
			if((x^u)==(x+u))
			{
				printf("2\n%lld %lld",x,x+u);
			}
			else
			{
				printf("3\n%lld %lld %lld",x,x,u);
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/106969188