-
1554-C, *1800코드포스 2021. 8. 14. 11:23
Problem - 1554C - Codeforces
codeforces.com
문제
- n, m(1≤n, m≤109)이 주어질때
S={n⊕0, n⊕1, ..., n⊕m}에 속하지 않는 음이아닌 최소 정수를 구하라
O(tlog n)
음이아닌 정수 k가 집합 S의 원소라면
∃x∈Z, 0≤x≤ms.t. n⊕x=k⇔n⊕k=x
따라서 n⊕k≥m+1인 최소 k가 구하려고 하는 값이다i) n≥m+1→k=0
ii) n<m+1n 1 0 1 0 1 m+1 1 1 0 1 0 k 0 1 0 0 0 예를 들어, 위와같이 n, m+1의 이진수 표현이 주어졌다고 하자
왼쪽 bit 부터 봤을 때 처음으로 n이 m+1보다 큰 비트를 기준으로
왼쪽은 n⊕m+1한 비트를 k 값으로(∵이 성립하게 하기 위함)
오른쪽은 0으로 채우면 된다123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#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 == 0) return 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+1) cout << 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;}cs'코드포스' 카테고리의 다른 글
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 - n, m(1≤n, m≤109)이 주어질때