C++题解:CSP迎国庆热身公益赛T1——位运算

本文解析一个算法问题,关于如何找到三个正整数满足特定的异或关系,通过逻辑分析和代码实现,探讨解的存在性和求解步骤。关键在于判断奇偶性和异或运算性质,适用于编程竞赛和数学趣味问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题⽬描述

给定 3个正整数a,b,ca, b, ca,b,c。请求出三个正整数 ,满足:

u+v=au + v=au+v=a
u−v=bu - v=buv=b
u⊕v⊕w=a⊕b⊕cu \oplus v \oplus w= a \oplus b \oplus cuvw=abc

其中⊕\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,61=5,6⊕1⊕15=7−⊕5⊕106 \oplus 1 \oplus 15= 7 - \oplus 5 \oplus 106115=7510
  • 13+7=20,13−7=613+7=20,13-7=613+7=20,137=6,13⊕7⊕20=20⊕6⊕1213 \oplus 7 \oplus 20= 20 \oplus 6 \oplus 1213720=20612
  • 可以证明第三组数据不存在正整数解。

数据范围

对于30%的数据,1≤a,b,c≤1021\le a,b,c\le10^21a,b,c102
对于60%的数据,1≤a,b,c≤1091\le a,b,c\le10^91a,b,c109
对于100%的数据,1≤a,b,c≤1018,1≤T≤1031\le a,b,c\le10^{18}, 1\le T \le10^31a,b,c1018,1T103

算法思想(模拟)

根据题目描述:

u+v=au + v=au+v=a
u−v=bu - v=buv=b

u=a+b2,v=a−b2u = \frac{a + b}{2},v = \frac{a - b}{2}u=2a+b,v=2ab,因此可知:当a+ba+ba+b为奇数,或者a≤ba\le bab时无解。

最后,由于 u⊕v⊕w=a⊕b⊕cu \oplus v \oplus w= a \oplus b \oplus cuvw=abc,根据异或性质:

a⊕a=0a \oplus a = 0aa=0

a⊕b⊕c⊕u⊕v⊕w=0a \oplus b \oplus c \oplus u \oplus v \oplus w = 0abcuvw=0,那么 w=a⊕b⊕c⊕u⊕vw = a \oplus b \oplus c \oplus u \oplus vw=abcuv

注意:

代码实现

#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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少儿编程乔老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值