1 条题解

  • 0
    @ 2025-8-24 21:18:12

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 21:18:11,当前版本为作者最后更新于2025-05-09 21:44:00,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    欢迎报名洛谷网校,期待和大家一起进步!

    本题考察枚举、位运算。

    首先先介绍一种笨办法——枚举法。题目中的 xx 是给出的,而且要求 yy 是正整数,这样我们可以使用一重循环去枚举 yy,对每一个 yy,计算题目中的算式是否成立。注意,and\operatorname{and} 在 C++ 中是 &,而 or\operatorname{or} 在 C++ 中是 |。参考代码:

    for (int i = 1; i <= 2025; i++){
        if ((x & i) + (x | i) == 2025) {
            cout << i << endl;
            return 0;
        }
    }
    

    这种做法足够通过本题。但是我们再介绍一种巧妙方法。题目中的 $(x \ \operatorname{and} \ y) + (x \ \operatorname{or} \ y)$ 这个式子,实则与 x+yx+y 是一致的!

    这是为什么呢?我们把 x,yx,y 拆成二进制数,对每一个数位(假设分别是 aabb)分别研究,可以得到下列情况:

    • 情况 1:aa00bb 也是 00,此时 aandb=0a \operatorname{and} b=0aorb=0a \operatorname{or} b=0a+b=0a + b = 0
    • 情况 2:aa00bb11,此时 aandb=0a \operatorname{and} b=0aorb=1a \operatorname{or} b=1,即 $(a \operatorname{and} b) + (a \operatorname{or} b) = 1$,而 a+b=1a + b = 1,两者相等;
    • 情况 3:aa11bb00,此时与情况 22 完全一致;
    • 情况 4:aa11bb 也是 11,此时 aandb=1a \operatorname{and} b=1aorb=1a \operatorname{or} b=1,即 $(a \operatorname{and} b) + (a \operatorname{or} b) = 2$,而 a+b=2a + b = 2,两者相等;

    在每一个位置上,$(a \ \operatorname{and} \ b) + (a \ \operatorname{or} \ b) = a + b$,因此对于整体来看计算结果也是一样的。

    因此题目就变为了:已知 x+y=2025x+y=2025xx,求出 yy 是多少。那么这个问题就非常简单了,直接输出 2025x2025-x 即可。代码略。

    • 1

    信息

    ID
    11771
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者