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

C. Mikasa 传送门

Accepted code

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

#define ll long long

void print(int i) {
    
    
    int ok = 0;
    if(i & 1) ok = 1;
    if(i >> 1) print(i >> 1);
    printf("%d", ok);
}

ll t, n, m;
ll ans = 0;

int main() {
    
    
    scanf("%lld", &t);
    while (t--){
    
    
        ans = 0;
        scanf("%lld%lld", &n, &m);
        if (m <= n){
    
    
            if (m < n) puts("0");
            else {
    
    
                ans = 1;
                while (n & 1){
    
    
                    n >>= 1;
                    ans <<= 1;
                }
                printf("%lld\n", ans);
            }
        } else {
    
    
            ll mm = m, idx = 0;
            while (mm) {
    
    
                mm >>= 1;
                ++idx;
            }
            ans = 0;
            int ok = 0;
            int flag = idx;
            for (ll i = idx - 1; i >= 0; i--){
    
    
                ans <<= 1;
                if ((!ok && (1 << i) & m) && !((1 << i) & n)) ans |= 1;
                if (!((1 << i) & m) && ((1 << i) & n))        ok = 1;
                if (!((1 << i) & m) && !((1 << i) & n))       flag = i;
            }
            if ((ans ^ n) <= m){
    
    
                ll cnt = (1 << flag);
                ans = ans - ans % cnt + cnt;
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}
/*
   1000101  n(69)
1010111000  m(696)
1010000000  所构造的ans(640)
1011000101  ans ^ n > m

   10000000000000000  n
11111111111111111111  m
11101111111111111111  ans
11110000000000000000  ans+1
11100000000000000000  n ^ (ans + 1)依然小于m
*/

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46144509/article/details/119236430