zoukankan      html  css  js  c++  java
  • 寒假Day58:CodeForces1325D Ehab the Xorcist 异或+思维

    题目链接:

    https://codeforces.com/contest/1325/problem/D

    题意:

    给出x、y两个数,求一个最短数组,要求该数组异或和为x,总和为y

    思路:

    因为x^w^w=x,所以可以判断最短数组长度为2或者3

    再从y-x中判断,如果y-x是一个奇数,说明x或者y中是一奇一偶的情况,直接输出-1就行

    然后特判x等于y的情况

    排除掉所有特殊情况,进入正常思路

    如果x&(y-x)/2为真的话,说明最短长度为3,否则说明x和w的二进制情况下,一位一位对齐,没有一组是都是1的情况,再去异或一个(y-x)/2,那么结果还是(y-x)/2它本身,没有意义,所以说明最短长度为2,两个元素x+(y-x)/2、 (y-x)/2。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    int main()
    {
        ll x,y;
        while(cin>>x>>y)
        {
            if(!x&&!y)
                cout<<0<<endl;
            else if(x>y||(y-x)%2)
                cout<<-1<<endl;
            else if(x==y)
                cout<<1<<endl<<x<<endl;
            else
            {
                ll w=(y-x)/2;
                if(x&w)
                    cout<<3<<endl<<x<<" "<<w<<" "<<w<<endl;
                else
                    cout<<2<<endl<<x+w<<" "<<w<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    多项式模板整理
    广大附中2019CSP模拟day6
    2019正睿CSP-S模拟赛十连测day6
    NOIP2020 游记
    NOI2020 退役记
    CSP2019 退役记
    目录
    NOI Online 提高
    后缀数组
    待学
  • 原文地址:https://www.cnblogs.com/OFSHK/p/12547215.html
Copyright © 2011-2022 走看看