※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 33272번 문제인 TAIDADA이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/33272
어떤 음이 아닌 정수 \(a\)에 대하여 이 수와 xor연산을 해 \(K\)가 되는 수는 두 수의 xor뿐임을 관찰하자.
\(K\)는 0이 아니므로, 위 관찰을 이용하면 어떤 한 정수를 수열에 넣고 해당 수와 \(k\)의 xor을 이후에 넣지 않는 것을 반복하는 방식으로 수열을 구성해 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <set>
#include <vector>
using namespace std;
int N, M, K;
bool visited[400001];
vector<int> ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> K; ans.reserve(N);
for (int i = 1; i <= M && ans.size() < N; i++) {
if (visited[i]) continue;
if ((i ^ K) < 400001) visited[i ^ K] = 1;
ans.emplace_back(i);
}
if (ans.size() < N) cout << -1;
else {
for (auto &x:ans) cout << x << ' ';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 27222 // C++] Штангист (0) | 2025.02.13 |
---|---|
[BOJ 22412 // C++] ABC Gene (0) | 2025.02.12 |
[BOJ 6913 // C++] Constrained Permutation (0) | 2025.02.07 |
[BOJ 18270 // C++] Livestock Lineup (0) | 2025.02.06 |
[BOJ 3870 // C++] Find the Multiples (0) | 2025.02.05 |