Codeforces Round #804 (Div. 2) A. The Third Three Number Problem 的题解

题目链接:

点击此处

题目要求:

        给一个 测试样例数 t;

        给一个 正整数 n;

        找到 任意三个 整数 a,b,c 使得 a^b + b^c + a^c == n;

        如果存在这么三个数,那么输出 a b c

        否则输出 -1;

必备知识:

异或操作 即  ^ 是按照 对应 二进制  进行的 操作

两数同一位置不同时 为 1

当两数同一位置相同时 为 0 

举例说明: 

        3的二进制:0011

        2的二进制:0010

        1的二进制:0001

根据异或操作可得:

        3^2 == 2^3 == 1

        3^1 == 1^3 == 2

        2^1 == 1^2 == 3

那么我们可以得到以下一些知识:

        1. a^b == b^a

        2. 如果 a^b == c 那么 a^c == b

        3.a^a == 0

        4.a^0 == a

题目分析:

        任意 a b c 两两异或之和 为 n

        如果 n 存在 那么 n 为 偶数

        证明如下:

                不论a b c 为正数 还是 负数

                if(a%2== 0) 则 a 为一个偶数 则 a 对应的二进制的最后一位 为 0

                if(a%2== 1) 则 a 为一个奇数 则 a 对应的二进制的最后一位 为 1

所以有如下四种情况

        1. 全为 奇数 即3个奇数 0个偶数

                a = xxx1 

                b = yyy1     

                c = zzz1

            两两 异或之和 的二进制 最后一位 为 0+0+0 == 0 ,那么这个数是偶数

        2. 2个奇数  1个偶数

                a = xxx1

                b = yyy1

                c = zzz0

        两两 异或之和 的二进制 最后一位 为 0+1+1 == 0 ,那么这个数是偶数

        3. 1个奇数  2个偶数

                a = xxx1

                b = yyy0

                c = zzz0

        两两 异或之和 的二进制 最后一位 为 1+1 +0 == 0 ,那么这个数是偶数

        4. 全为偶数 即 0个奇数  3个偶数

                a = xxx0

                b = yyy0

                c = zzz0

        两两 异或之和 的二进制 最后一位 为 0+0+0 == 0 ,那么这个数是偶数

所以  n 一定是偶数

核心代码

        if(n%2==0){

                cout<<1<<' '<<1<<' '<< ((n/2)^1)<<endl;       

        }else{

                cout<<-1<<endl;

        }

为什么 将 a b 特取 为 1 呢

        因为 这样一来 a^b == 0

        a^c == b^c == n/2

所以 c = (n/2)^1 容易计算

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值