1 条题解

  • 0
    @ 2025-8-24 22:39:59

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar max0810
    刚刚上初一,正在学习数据结构,求大佬带

    搬运于2025-08-24 22:39:59,当前版本为作者最后更新于2022-09-16 11:28:09,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    考试的时候在乱猜结论,交了几遍就过了,证明当然是赛后才想的()

    文中加粗部分是需要读者稍微思考一下原因的地方 (不是重点)


    先考虑一下样例二,将 101810^{18} 化成二进制:1101...0010000000000000000001101...001000000000000000000

    其实只需要知道末尾有 181800 就行了,因为在 xx 变为 x2cx^{2c} 时,后面 181800 就会变成 18×2c18\times 2c00,如果再异或 cc,就相当于把末尾的几位变成 cc,此时除了末尾上的 ccx2ccx^{2c}\oplus c 的前面部分的数已经不会影响结果了(因为最后求 lowbit\operatorname{lowbit} 就只关心末几位的值)。所以每做一次操作,末几位都是 cc,那么最后的 lowbit\operatorname{lowbit} 就是 lowbit(c)\operatorname{lowbit}(c)

    再扩展到一般情况:

    • cc 是偶数,aa 是奇数,那么二进制中的最后一位就始终都是 11,所以最后的 lowbit\operatorname{lowbit} 就是 11

    • cc 是偶数,aa 是偶数,这个就和样例二差不多:aa 的二进制末尾至少有一个 00a2ca^{2c} 的末尾就至少有 2c2c00,肯定比 cc 的二进制的位数多,异或 cc 就相当于把末尾的几位变成 cc,又因为 cc 是偶数,所以 a2cca^{2c}\oplus c 的末尾也至少有一个 00,又变成了开始的情况,只不过末几位是 cc 而不是 aa。一直推下去,最后的 lowbit\operatorname{lowbit} 就是 lowbit(c)\operatorname{lowbit}(c)

    • cc 是奇数,此时根据 aa 的奇偶又分成两种情况:

      • aa 是偶数,和前面一样:a2ca^{2c} 的末尾至少有 2c2c00,异或 cc 就相当于把末尾的几位变成 cc,因为我们只关心末几位,所以就可以把原数看成 cc
      • aa 是奇数,那么 a2ca^{2c} 也是奇数,因为 cc 也是奇数,奇数异或奇数就变成了偶数,然后又变成了上一个情况,即奇偶交替。
      • 如果最后的数是个奇数,那么 lowbit\operatorname{lowbit} 就是 11
      • 如果最后是个偶数,那么就要考虑倒数第二步。因为 b>1b>1,所以倒数第二步的数的二进制末尾一定是 cc,那么最后答案就相当于 lowbit(c2cc)\operatorname{lowbit}(c^{2c}\oplus c)

    其实做到这就已经做完了,但是 lowbit(c2cc)\operatorname{lowbit}(c^{2c}\oplus c) 还可以化简一下。

    考虑用二项式定理展开 c2cc^{2c}

    $$c^{2c}=(c-1+1)^{2c}=\sum_{i=0}^{2c} C_{2c}^{i}\times (c-1)^i=1+2c(c-1)+C_{2c}^{2}\times (c-1)^2+...+(c-1)^{2c} $$

    我们将上式所有项按 lowbit\operatorname{lowbit} 大小来排序,最小的两项当然是 112c(c1)2c(c-1),因为 c1c-1 是偶数,所以 $\operatorname{lowbit}(2c(c-1))=\operatorname{lowbit}(c-1)\times 2$

    从第三项开始,所有项的 lowbit\operatorname{lowbit} 都不小于 lowbit(c1)×2\operatorname{lowbit}(c-1)\times 2,所以 c2cc^{2c} 一定可以被表示为 k×lowbit(2(c1))+1k\times \operatorname{lowbit}(2(c-1))+1,其中 kN+k\in N^+

    形象点,把 c2cc^{2c}cc 的二进制分别表示出来(随便一个例子,只需要看后五位):

    c2cc^{2c}1101...10100011101...1010001

    cc  1010...0101001\ \ 1010...0101001

    可以发现,最末尾的 11 会抵消,但倒数第二位不会,所以 $\operatorname{lowbit}(c^{2c}\oplus c)=\operatorname{lowbit}(c-1)$。

    #include <iostream>
    #include <cstdio>
    #define ll long long
    using namespace std;
    ll a,b,c;
    ll lb(ll x){return x&-x;}
    int main()
    {
        cin >> a >> b >> c;
        if(c&1)
        {
            if((a&1)^(b&1))cout << 1; //ab不同奇偶,那么最后答案就是奇数
            else cout << lb(c-1); //ab同奇偶,最后答案就是偶数
        }
        else cout << ((a&1)?1:lb(c));
        return 0;
    }
    
    
    • 1

    信息

    ID
    7851
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者