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;
}

浙公网安备 33010602011771号