• D:Ehab the Xorcist


    Ehab the Xorcist

    思路

    刚看时确实是一脸懵,最怕的就是这种构造题了,然后细想好像能写啊。

    判断不可行的条件,只有两种情况:

    • 一、(v < u)是一定不可能的,一串数的异或值一定小于其数串的和。
    • 二、当u是奇数时,数串中一定存在奇数个奇数,所以整体的和一定是奇数;当u时偶数时,如果存在奇数,那么一定是偶数个奇数,所以整体的和一定是偶数。

    到了这里两种不可行的情况就考虑完了, n接下来我们考虑可行的方案:

    • 假设(v == u),当(v = 0)的时候直接输出0,当(v != 0)的时候,就是"1 v ",即可。
    • 我们考虑下一种情况的最小串的情况:我们约定temp = (u - v) >> 1,一定可以构造出(temp | temp | v)是符合要求的。但是我们要考虑其值最小,我们想想还有没有可能得到(n = 2)的情况,当然是存在的,当(v & temp == 0)的时候,我们显然可以构造出(v + temp | temp)也是符合条件的。

    代码

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long ll;
    
    inline ll read() {
        ll f = 1, x = 0;
        char c = getchar();
        while(c < '0' || c > '9') {
            if(c == '-') f = -1;
            c = getchar();
        } 
        while(c >= '0' && c <= '9') {
            x = (x << 1) + (x << 3) + (c ^ 48);
            c = getchar();
        }
        return f * x;
    }
    
    int main() {
        // freopen("in.txt", "r", stdin);
        // freopen("out.txt", "w", stdout);
        ios::sync_with_stdio(false);
        ll u = read(), v = read();
        if(((u & 1) == (v & 1)) && (v >= u)) {
            if(u == v) {
                if(!u)  puts("0");
                else cout << "1
    " << u << "
    ";
            }
            else {
                ll temp = v - u >> 1;
                if((temp & u) == 0)
                    cout << "2
    " << u + temp << " " << temp << "
    ";
                else cout << "3
    " << u << " " << temp << " " << temp << "
    ";
            }
        }
        else    puts("-1");
        return 0;
    }
    
  • 相关阅读:
    iOS之地理位置及定位系统 -- 入门笔记(用Swift)
    网易新闻iOS版使用的18个开源组件
    自学 iOS – 三十天三十个 Swift 项目
    iOS之UI--富文本总结
    IOS开发--横向流水布局实现
    IOS开发--仿制网易新闻
    Runtime 方法替换 和 动态添加实例方法 结合使用
    写给IOS开发工程师的网页前端入门笔记
    Runtime(动态添加属性)
    const,static,extern简介(重要)
  • 原文地址:https://www.cnblogs.com/lifehappy/p/13068568.html
Copyright © 2020-2023  润新知