1 条题解

  • 0
    @ 2025-8-24 22:24:40

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar WarningQAQ
    私永遠に百鬼あやめが好きです

    搬运于2025-08-24 22:24:40,当前版本为作者最后更新于2020-10-20 09:12:32,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    位运算的题都挺有意思的。

    分析:

    给一个数 nn ,求 xx xor\text{xor} nn ++ xx oror nn 最大, (1xn)(1\leq x\leq n)

    首先根据样例分析:

    50101(bin)5\to 0101(\text{bin}) 20010(bin)2\to 0010(\text{bin})

    异或得 70111(bin)7\to0111(\text{bin}) , 或得 70111(bin)7\to0111(\text{bin}) , 和为 141110(bin)14\to1110(\text{bin})

    看不出什么 , 再来想一组样例:

    801000(bin)8\to01000(\text{bin}) 700111(bin)7\to00111(\text{bin})

    异或得 1501111(bin)15\to01111(\text{bin}) , 或得 1501111(bin)15\to01111(\text{bin}) , 和为 3011110(bin)30\to11110(\text{bin})

    所以就找到了规律:

    找到与 nn 异或的值和或的值相等的数。

    也就是在二进制下每一位都与 nn 不同的数。

    换言之,最终的答案就是二进制下 nn 的每一位都为 11 的数再乘以 22

    代码:

    #include "cstdio"
    #define ull unsigned long long//不开ull见祖宗
    ull n, k, ans;
    int main() {
        scanf("%llu", &n);
        k = n;
        while (k) {
            k >>= 1;
            ans = ans << 1 | 1;
        }
        printf("%llu", ans << 1);
    }
    
    • 1

    信息

    ID
    6006
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者