Codeforces Round #628 (Div. 2) D Ehab the Xorcist

传送门
首先我们先来谈谈一会异或 x o r xor xor
今天又学习到了一个新的知识 a ⨁ b = a + b − 2 ( a & b ) a \bigoplus b=a+b-2(a\&b) ab=a+b2(a&b) 以及异或和 <= 总和
下面来说说题意:
给定两个数字 u u u, v v v.构造几个数,使他们的异或和为u,和为v

  1. 如果只有一个构造的序列只有一个数字,那么自然满足,这个时候 u = = v u==v u==v
  2. 由于异或性质,只有奇数个奇数在异或时和奇数,所以我们推出u和v%2同余
  3. 因为异或和 <= 总和 所以 u > v u > v u>v不成立
  4. 朴素情况下令 x = ( v − u ) / 2 x=(v-u)/2 x=(vu)/2,此时构造出 ( u , x , x ) (u,x,x) (u,x,x)答案一定满足
    但是我们发现仍然有机会优化:由上面的公式可以知道 u ⨁ v = u + x − 2 ( u & x ) u \bigoplus v = u + x -2(u\&x) uv=u+x2(u&x)推导得出:
    ( u + x + x ) = ( u ⨁ x ) + x (u+x+x) = (u \bigoplus x)+x (u+x+x)=(ux)+x
    u ⨁ x ⨁ x = u ⨁ x ⨁ x u\bigoplus x\bigoplus x = u \bigoplus x\bigoplus x uxx=uxx
    所以 ( u & x ) = 0 (u\&x) = 0 (u&x)=0当时,可以把答案化简为 ( u ⨁ x ) (u\bigoplus x) (ux)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    ll u,v;
    cin >> u >> v;
    if(u > v || u % 2 != v % 2)
    {
        return printf("-1\n"),0;
    }
    if(u == v && u == 0)
    {
        cout <<"0";
    }
    else if(u == v)
    {
        cout << "1\n" << v <<"\n";
    }
    else 
    {
        ll x = (v - u) / 2;
        if(x & u)
        {
            cout << "3\n" << x << " "<< x << " "<< u;
        }
        else cout <<"2\n" << (x^u) << " " << x;
        puts("");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值