1 条题解

  • 0
    @ 2025-8-24 21:15:55

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar szh_AK_all
    S挂分挂到被洛谷7级勾卡线|I can do all things

    搬运于2025-08-24 21:15:54,当前版本为作者最后更新于2023-12-26 12:53:16,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    出题人题解。

    分析

    我们有一个数 nn,如要使 nn 在二进制下从右往左数的第 kk 位为 11,则需判断这一位是否为 11,如果是,则无需进行任何操作,否则,nn 会改变,操作数也会改变。

    举个例子:考虑 55 在二进制下的第 22 位是否为 1155 在二进制下表示为 101101,第二位为 00。可以发现,一个数在二进制下的第 kk 位是否为 11 与最高位到第 k+1k+1 位无关,所以,我们要取出这个数的第 11 位到第 kk 位。

    如何取出这个数的第 11 位到第 kk 位呢?只需要这个数对 2k2^{k} 取模即可。因为,这个数在二进制下的第 11 位到第 kk 位一定小于 2k2^{k},而最高位到第 k+1k+1 位一定是 2k2^{k} 的倍数。同上面的例子一样,55222^{2} 取模,得到 11,也就是二进制下的 0101;

    假设令 nn 在二进制下的第 kk11 需要 nn 至少加上 tt,那么 tt 就是操作数。由于操作数要尽可能小,那么我们需要让 nn 在二进制下的第 11 到第 kk 为的值为 2k12^{k-1}。举个例子,若要使一个数在二进制下的第 44 位为 11,只需让这个数在二进制下的第 11 到第 kk 位在二进制下表示为 10001000。如果表示为 10011001 则不是最优操作。所以,在最优情况下,操作数为 2k1(nmod(2k)) 2^{k-1} - (n \bmod (2^k))

    如果 nn 在二进制下的第 kk 位本身就是 11,那么取出的第 11 到第 kk 位肯定大于或等于 2k12^{k-1},所以在计算操作数时将 2k1(nmod(2k)) 2^{k-1} - (n \bmod (2^k))00 取个最大值即可。 局部代码如下:

    lg[0] = 1;
    for (int i = 1; i <= 32; i++)
    		lg[i] = lg[i - 1] * 2;
    ...
    int k;
    cin >> k;
    if (lg[k - 1] > (n % lg[k])) {
    	ans += lg[k - 1] - (n % lg[k]);
    	n += lg[k - 1] - (n % lg[k]);
    }
    
    • 1

    信息

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