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);
			}
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章