CF1325D Ehab the Xorcist

CF1325D Ehab the Xorcist

就很神奇的一道构造题(完全没有往这么简单的方向想啊)

情况1:由于异或本质上是不进位的加法,所以异或和 \(\le\) 加和。所以 \(u \gt v\) 时输出 \(-1\)

情况2:在情况一的基础上推广,异或和与加和的奇偶性相同。所以 \(u \not\equiv v \pmod 2\) 时也输出 \(-1\)

情况3:考虑先分出一个 \(u\) 保证异或和,为保证剩下 \(v - u\) 不对异或和产生影响,拆成两个 \(\frac{v - u}{2}\),分别记为 \(u, t, t\)。进一步,若 \(u\)\(t\) 合并不对异或和产生影响,即 \(u \oplus t = u + t\),则可以合并成 \(u + t, t\) 两个数。

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l); i <= (r); ++ i)
#define G(i,r,l) for(int i(r); i >= (l); -- i)
using namespace std;
using ll = long long;
ll u, v;
signed main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> u >> v;
	if(u == 0 && v == 0){
		cout << "0"; 
	}
	else if(u == v){
		cout << "1\n" << u << '\n';
	}
	else if(u % 2 != v % 2 || u > v){
		cout << "-1";
	}
	else{
		ll s1 = u, s2 = (v - u) / 2ll, s3 = s2;
		if((s1 ^ s2) == s1 + s2){
			s1 ^= s2;
			cout << "2\n" << s1 << ' ' << s3 << '\n'; 
		} 
		else cout << "3\n" << s1 << ' ' << s2 << ' ' << s3 << '\n';
	}
	return fflush(0), 0;
}

posted @ 2025-07-26 16:27  superl61  阅读(5)  评论(0)    收藏  举报