Codeforces Round #628 (Div. 2)(异或,构造思维)

    题意:给出u,v。要求给出一个最短的数组,要求这个数组异或结果为u,和为v。

     解析 :所谓xor,相同为0,否则为1。就是一个不进位的二进制加法(这里不理解的建议去看看二进制加法法则,再与此做对比)。

       1:u>v。根据上述,不进位的u都比v大,那进位的话会更大,这些数加起来肯定比v大,所以无解,-1。

       2:u==v,直接输出u即可

         3:u<v。我们可以从结果为3个 数入手。可以构造为x,x,u。为什么,因为x^x==0,而0异或一个数等于这个数的本身,即x^x^u==u。要想保证和为v,那么x=(v-u)/2即可。这个要保证整除,所以(v-u)%2!=0肯定无解了。看样例,存在结果有2个的情况,这里实际上是进行了合并。有两种合并方式:2x,u和x,x+u。2x,u是不可以的。如果2x^u==u,那么2x==0,于是2x+u==v==u,这不符合u<v的前提。所以x,x+u为正确合并方式,已知x=(v-u)/2,那么x+u就为(v+u)/2,那么我们直接算出mid1=(u+v)/2,mid2=(v-u)/2,判断是否满足mid1+mid2==v而且mid1^mid2==u即可。先判断它,因为题目要求最短数组。不行的话,再输出3个的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
//priority_queue<ll,vector<ll>,greater<ll> >q;
int main()
{
    ll u,v;
    cin>>u>>v;
    if(u==0&&v==0)
    {
        cout<<"0"<<endl;return 0;
    }
    if(u>v)
        cout<<"-1"<<endl;
    else if(u==v)
        {
            cout<<"1"<<endl;
            cout<<u<<endl;
        }
    else
    {
        ll mid1=(u+v)/2;
        ll mid2=(v-u)/2;
        if((v-u)%2!=0)
        {
            cout<<"-1"<<endl;return 0;
        }
        if((mid1+mid2)==v&&(mid1^mid2)==u)
        {
            cout<<"2"<<endl;
            cout<<mid1<<" "<<mid2<<endl;
            return 0;
        }
        cout<<"3"<<endl;
        cout<<mid2<<" "<<mid2<<" "<<u<<endl;
    }
}

    还有一套解法:推荐看这个博主写的https://www.cnblogs.com/1024-xzx/p/12505710.html

    插个公式:

           即加法=不进位加法+进位数字

原文地址:https://www.cnblogs.com/liyexin/p/12562629.html

时间: 2024-10-09 01:31:01

Codeforces Round #628 (Div. 2)(异或,构造思维)的相关文章

Codeforces Round #276 (Div. 2)C. Bits(构造法)

这道题直接去构造答案即可. 对于l的二进制表示,从右到左一位一位的使其变为1,当不能再变了(再变l就大于r了)时,答案就是l. 这种方法既可以保证答案大于等于l且小于等于r,也可以保证二进制表示时的1最多. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include&l

Codeforces Round #447 (Div. 2) C 构造

现在有一个长度为n的数列 n不超过4000 求出它的gcd生成set 生成方式是对<i,j> insert进去(a[i] ^ a[i+1] ... ^a[j]) i<=j 然而现在给你了set 规模m<=1000 求原数列或check不可行 可以想到set中的max数字一定是原数列中的max , min数字一定是所有数字的因子 然而这样就走不下去了,没法通过枚举n或者什么来确定是否存在 一通乱想之后想出来了奇妙的解法.. 解:最小的数字为x 那么原数列中所有的数字都是x的倍数 它们

Codeforces Round #514 (Div. 2) C. Sequence Transformation 思维构造

题意 给出一个1-n的集合   gcd 集合里面的所有数  得到的 一个 数   然后自己选择删去一个数   要使得到的数 构成的数列 的字典序最大 思路: gcd所有数 那gcd得到的数肯定要小于数组中最小的数  所以 刚开始都是1   所以优先删去1  那就要使gcd所有数经可能快得到 2 如何快速到2 呢 那就是把奇数全部删掉  那剩下得数最小就为2 了  此时为 2 4 6 8 10....  此刻就从2开始删   当n==3时 有 x ,2x,3x  此时 只有 删 x 2 x   3

Codeforces Round #619 (Div. 2)C(构造,容斥)

1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int main(){ 5 ios::sync_with_stdio(false); 6 cin.tie(NULL); 7 cout.tie(NULL); 8 int t; 9 cin>>t; 10 while(t--){ 11 long long n,m; 12 cin>>n>>m; 13 lo

Codeforces Round #628 (Div. 2) C

原题 题意:给你N个点和N-1条边,每条边不相同,大小为 [ 0 , N-1 ] ,你要使任意两个节点构成的所有(u,v)的MEX(u,v)的最大值尽可能小 ,MEX(u,v)表示从节点u到节点v的唯一简单路径上没有写在任何边上的最小非负整数(即不等于任何u 到 v 所经过的边的权值的最小自然数). 本题题意有点绕,我们要找最小值,就要从0这个最小的数入手,我们只要不让一条路径上的各个边从0开始连续,就能让MEX(u,v)尽可能小.如果一条路径只经过一条边,那么MEX(u,v)一定是0,如果不止

Codeforces Round #629 (Div. 3) D. Carousel(思维/贪心?)

The round carousel consists of nn figures of animals. Figures are numbered from 11 to nn in order of the carousel moving. Thus, after the nn -th figure the figure with the number 11 follows. Each figure has its own type — the type of the animal corre

Codeforces Round #423 Div. 2 C-String Reconstruction(思维)

题目大意:告诉你n个字符串以及这些字符串在字符串s中出现的位置(x1,x2.....xn),要求在满足上述条件的情况下,求出字典序最小的字符串s. 解题思路:主要问题是,如果直接模拟是会超时的,比如vvvvvvvvvv 3 1 2 3这样就有大量重复(因为题目说了这些字符串位置不会相互矛盾,所以已经有了字符的地方可以不用管了),每次都重复了len-1的长度,如果这段字符串长度为1e6那很容易就超时了.所以这里添加一个pre记录上一次字符串的末尾位置(因为题目说了给出的位置时递增的),每次比较一下

Codeforces Round #353 (Div. 2) A. Infinite Sequence 思维题

A. Infinite Sequence time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Vasya likes everything infinite. Now he is studying the properties of a sequence s, such that its first element is equal

Codeforces Round #275 (Div. 1)A. Diverse Permutation 构造

Codeforces Round #275 (Div. 1)A. Diverse Permutation Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/482/problem/A Description Permutation p is an ordered set of integers p1,   p2,   ...,   pn, consisting of n distinct posi