Processing math: 93%

ABOUT ME

Today
Yesterday
Total
  • 1554-C, *1800
    코드포스 2021. 8. 14. 11:23
     

    Problem - 1554C - Codeforces

     

    codeforces.com

    문제

    • n, m(1n, m109)이 주어질때
      S={n0, n1, ..., nm}에 속하지 않는 음이아닌 최소 정수를 구하라

     

    O(tlog n)

    음이아닌 정수 k가 집합 S의 원소라면
    xZ, 0xms.t. nx=knk=x
    따라서 nkm+1인 최소 k가 구하려고 하는 값이다

    i) nm+1k=0
    ii) n<m+1

    n 1 0 1 0 1
    m+1 1 1 0 1 0
    k 0 1 0 0 0

    예를 들어, 위와같이 n, m+1의 이진수 표현이 주어졌다고 하자
    왼쪽 bit 부터 봤을 때 처음으로 nm+1보다 큰 비트를 기준으로
    왼쪽은 nm+1한 비트를 k 값으로(이 성립하게 하기 위함)
    오른쪽은 0으로 채우면 된다

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <bits/stdc++.h>
    #define endl "\n"
    #define loop(i, n) for(int i = 1; i <= n; i++)
    using namespace std;
     
    int n, m;
     
    int bit_cnt(int tar)
    {
        if(tar == 0return 1;
        int bit = 0;
        while(tar > 0){
            tar >>= 1;
            bit++;
        }
        return bit;
    }
     
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
     
        int t;
        cin >> t;
        while(t--){
            cin >> n >> m;
            if(n >= m+1cout << 0 << endl;
            else{
                bitset<30> bit_n(n);
                bitset<30> bit_m1(m+1);
                int m_size = bit_cnt(m+1)-1;
     
                bool flag = false;
                for(int i = m_size; i >=0; i--){
                    if(flag) bit_n[i] = 0;
                    else{
                        if(bit_n[i] == 1 && bit_m1[i] == 0){
                            flag = true;
                            bit_n[i] = 0;
                        }
                        else bit_n[i] = bit_m1[i]^bit_n[i];
                    }
                }
     
                cout << bit_n.to_ullong() << endl;
            }
        }
     
        return 0;

     

    '코드포스' 카테고리의 다른 글

    1553-D, *1500  (0) 2021.08.15
    1554-A, *800  (0) 2021.08.15
    1554-D, *1800  (0) 2021.08.13
    1513-B, *1400  (0) 2021.08.11
    1547-C, *1100  (0) 2021.08.10

    댓글

Designed by Tistory.