Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Mar 17, 2025

🧷 문제 링크

https://www.acmicpc.net/problem/33616

🧭 풀이 시간

40분

👀 체감 난이도

✏️ 문제 설명

정수 a, b가 있다.
여기에 어떤 양의 정수 x를 골라 두 가지 종류의 조작을 할 수 있다.

  1. $a$$a \oplus x$로, $b$$b+x$로 바꾼다.
  2. $a$$a+x$로, $b$$b \oplus x$로 바꾼다.
    a와 b를 같게 만들 수 있는지 판별하고, 가능하다면 최소 조작 횟수와 조작 명령을 직접 출력해보자.

🔍 풀이 방법

[사용한 알고리즘]

  • 비트마스킹

우선, 저 xor연산에서 $a \oplus b = (a \wedge b) - (a \vee b) = (a+b) - 2(a \vee b)$이다.

만약 조작 1회만으로 같게 할 수 있다면, 어떤 수 $x$에 대해
$a \oplus x = b + x$가 된다. (일반성을 잃지 않고, a > b라 가정)

위 식으로 고쳐쓰면
$a + x - 2(a \vee x) = b + x$
$a-b = 2(a \vee x)$가 된다.
그래서, $x = (a-b)/2$가 되고, 유효성만 확인해주면 된다.

만약 조작 1회만으로 안 된다면, 유효한 모든 경우에 대해 2회 만에 항상 가능하다.
마찬가지로 $a > b$라 하면,
$x = (b-a)/2$라 두고 같은 조작을 2회 시행하면 항상 둘이 같아진다.

불가능한 경우는 바로 저 x값이 정수가 아닌 경우가 된다.

⏳ 회고

너무 어렵다 비트

@oncsr oncsr self-assigned this Mar 17, 2025
@oncsr oncsr added the success 👍 해설을 보지 않고 풀었을 때 label Mar 17, 2025
@ShinHeeEul ShinHeeEul merged commit c712be8 into main Mar 17, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants