Codeforces Round #735 (Div. 2) C. Mikasa


Codeforces Round #735 (Div. 2) C. Mikasa

ps:代碼最后調出來來不及交了,沒有AC,純屬口嗨 qwq

本質是找個最小的k使得n^k>m

\(n > m\) 則答案為0

下面描述的n的變化量即為要找的k。

1、找到n最高的值為1且不與m相同的一個二進制位,假設為第x位,代表的值為2^(x-1)

2、若能找到這樣的二進制位,因為要使n^k>m,那么n高於該位的值為0的位都應該向m補齊(補齊,即若m此位為1,n此位為0,則應該補為1),低於該位的不做處理(保證n的變化量,即k盡量小)。

3、若找不到這樣的二進制位,那么可以以最低的代價造一個這樣的二進制位(即找到m的二進制值為0的最低位,把n對應位置變成1),然后再按照上面處理。

明天再交代碼試試。

更新:
果然A了。就差2分鍾啊!我的分!

代碼

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

int t;
LL n, m;

//找二進制為0的最低位
LL ct(LL x) {
    LL res = 1;
    while(true) {
        if ((x & res) == 0) return res;
        res <<= 1;
    }
}

int main() {
    scanf("%d", &t);
    while(t--) {
        scanf("%lld%lld", &n, &m);
        if (n > m) {
            printf("0\n");
            continue;
        }

        //找x代表的值
        LL tmp = 1, last = -1;
        while(tmp <= n) {
            if ((n & tmp) != 0 && (m & tmp) == 0) {
                last = tmp;
            }
            tmp <<= 1;
        }

        LL p = ct(m);
        if (last == -1) {
            printf("%lld\n", m+p-n-(m%p)+(n%p));
        } else {
            printf("%lld\n", m-(m%last)-(n-(n%last)-last));
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM