题⽬描述
给定 3个正整数a,b,ca, b, ca,b,c。请求出三个正整数 ,满足:
u+v=au + v=au+v=a
u−v=bu - v=bu−v=b
u⊕v⊕w=a⊕b⊕cu \oplus v \oplus w= a \oplus b \oplus cu⊕v⊕w=a⊕b⊕c
其中⊕\oplus⊕表示逻辑异或运算,在 c++ 中可以通过 a ^ b
得到 a 异或 b 的值。
如果不存在,请输出 -1。可以证明,最多只有⼀组满⾜条件的 。
输入描述
本题有多组测试数据。
第⼀⾏⼀个整数 TTT,表⽰数据组数。
接下来TTT行, 每行3个正整数a,b,ca, b, ca,b,c。
输出描述
TTT行,每行输出三个正整数 或者输出 -1 表⽰⽆解。
输入样例
3
7 5 10
20 6 12
10 12 10
输出样例
6 1 15
13 7 20
-1
样例解释
对于样例:
- 6+1=7,6−1=56+1=7,6-1=56+1=7,6−1=5,6⊕1⊕15=7−⊕5⊕106 \oplus 1 \oplus 15= 7 - \oplus 5 \oplus 106⊕1⊕15=7−⊕5⊕10,
- 13+7=20,13−7=613+7=20,13-7=613+7=20,13−7=6,13⊕7⊕20=20⊕6⊕1213 \oplus 7 \oplus 20= 20 \oplus 6 \oplus 1213⊕7⊕20=20⊕6⊕12
- 可以证明第三组数据不存在正整数解。
数据范围
对于30%的数据,1≤a,b,c≤1021\le a,b,c\le10^21≤a,b,c≤102
对于60%的数据,1≤a,b,c≤1091\le a,b,c\le10^91≤a,b,c≤109
对于100%的数据,1≤a,b,c≤1018,1≤T≤1031\le a,b,c\le10^{18}, 1\le T \le10^31≤a,b,c≤1018,1≤T≤103
算法思想(模拟)
根据题目描述:
u+v=au + v=au+v=a
u−v=bu - v=bu−v=b
得 u=a+b2,v=a−b2u = \frac{a + b}{2},v = \frac{a - b}{2}u=2a+b,v=2a−b,因此可知:当a+ba+ba+b为奇数,或者a≤ba\le ba≤b时无解。
最后,由于 u⊕v⊕w=a⊕b⊕cu \oplus v \oplus w= a \oplus b \oplus cu⊕v⊕w=a⊕b⊕c,根据异或性质:
a⊕a=0a \oplus a = 0a⊕a=0
a⊕b⊕c⊕u⊕v⊕w=0a \oplus b \oplus c \oplus u \oplus v \oplus w = 0a⊕b⊕c⊕u⊕v⊕w=0,那么 w=a⊕b⊕c⊕u⊕vw = a \oplus b \oplus c \oplus u \oplus vw=a⊕b⊕c⊕u⊕v。
注意:
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
int T;
cin >> T;
while(T --)
{
LL a, b, c;
cin >> a >> b >> c;
if((a + b) % 2 || a <= b)
{
cout << -1 << endl;
continue;
}
LL u = (a + b) / 2, v = (a - b) / 2, w;
w = a ^ b ^ c ^ u ^ v;
if(w <= 0) cout << -1 << endl;
else cout << u << " " << v << " " << w << endl;
}
}