E. Vlad and a Pair of Numbers
题目抽象为给 \(n\) \((1\le n\le 2^{29})\),求 \(x\) 满足 \((n-x)\oplus (n+x)=n\),输出 \(n-x\) 和 \(n+x\)。
显然 \(n\) 为奇数肯定不行。
记 \(a=n-x,b=n+x\),由位运算的性质有 \(a+b=a\oplus b+2\cdot (a\& b)\)。
\[a+b=a\oplus b+2\cdot (a\& b) \tag{1} \]\[\frac{a+b}{2}=a\oplus b \tag{2} \]由 (\(1\)) (\(2\)) 可得:
\[a\oplus b=2\cdot (a\&b)=n \]\[\frac{a+b}{2}=2\cdot (a\& b) \]那么可以让 \(a=(a\&b),b=3\cdot (a\&b)\)。
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
void solve() {
int n;
cin >> n;
if (n % 2 == 1) {
cout << -1 << '\n';
return;
}
int a = n / 2;
int b = 3 * a;
if ((a + b) / 2 != (a ^ b)) {
cout << -1 << '\n';
} else {
cout << a << ' ' << b << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int tt = 1;
cin >> tt;
while (tt--) {
solve();
}
return 0;
}
标签:847,le,cdot,tt,Codeforces,tag,Div,oplus
From: https://www.cnblogs.com/kiddingma/p/17069826.html