[백준] 30798. gahui and sousenkyo 6

newbieski·2024년 1월 19일
0

백준

목록 보기
210/210

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

문제 요약

  • xor해서 x가 되는 서로다른 n개의 숫자 구하기
  • 0 <= x <= 2^30, 0 < 숫자 < 2^63, 4 <= n <= 10^6

접근법

  • 기본적인 아이디어
    • 1, 2, 3, 4, 5, ... 를 하고 마지막 숫자는 1^2^3^4^5 하기
    • 1, 2, 3, 4, 5 연속으로 xor하면 주기적으로 0이 나옴
    • 1, 2, 4, 8, 7, 15 처럼 한 비트씩만 사용하고 마지막 비트는 모든 비트를 사용하면 xor하면 0
  • 마지막 숫자가 겹칠 수 있으므로 적절히(?) 변환
  • 케이스를 나눠서 접근해본다.
  • x가 0이 아닌 경우
    • 1,2,3,4,5.... 와 1^2^3^... 를 준비하고 모두 31 bit shift
    • 마지막 숫자에만 x를 더함(x < 2^30이기 때문에 비트가 안 겹침)
  • x가 0인 경우
    • 방금 사용한 방법을 적용을 못함(+ 0이라 효과가 없음)
    • 연속숫자 xor 0 과 한비트씩 사용해서 0을 만드는 것을 혼합해서 적용
    • 주기적으로 0을 이용 => 적절한 개수까지는 연속숫자를 이용해서 0이 나오게 만듬. 그리고 31bit shift
    • 나머지 개수 한비트씩 사용해서 0을 만들도록 함 => 30개 정도는 커버 가능함
  • 출력은 내림차순 정렬
  • 0이 발생하지 않도록 주의
profile
newbieski

0개의 댓글