BOJ 4906 Musical Chairs

BOJ 4906 Musical Chairs

문제 링크:

문제 내용

1,2,,N1, 2, \cdots, N의 번호가 매겨져 있는 NN명의 사람이 번호 순서대로 원 모양으로 앉아 있습니다. 1번부터 시작하여 번호가 증가하는 방향으로 세어 DD번째 사람을 원에서 제거하는 것을 원에 한 명만 남을 때까지 반복합니다.

원에 남는 사람의 번호를 구하세요.

입력

여러 개의 테스트 케이스가 주어집니다. 각 테스트 케이스에 대해, NNDD의 값이 한 줄에 순서대로 주어집니다. (1N,D<1061 \le N, D < 10^6) 입력은 0 0으로 종료되며, 이 줄은 처리하지 않습니다.

모든 테스트 케이스의 NN의 합은 6×1066 \times 10^6을 초과하지 않습니다.

출력

각각의 테스트 케이스에 대해, NN, DD, 그리고 정답을 한 줄에 출력합니다.

문제 풀이

스포일러

이 문제는 유명한 요세푸스 문제입니다.

사람의 번호를 0-based로 바꾸고 생각해 봅시다. NN명이 있을 때 첫 턴에는 x=(D1)modNx = (D-1) \bmod N번 사람이 탈락하며, xx보다 작은 번호를 가진 사람이 xx명, 큰 번호를 가진 사람이 Nx1N-x-1명이 남습니다.

이제 N1N-1명이 있을 때의 승자를 kk라고 하면, 이 과정을 역으로 진행하여 NN명이 있을 때의 승자의 번호를 구할 수 있습니다. 구체적으로 답은 다음과 같습니다.

  • k<Nx1k < N - x - 1이면 k+x+1k + x + 1이 승자입니다.
  • kNx1k \ge N - x - 1이면 k(Nx1)k - (N - x - 1)이 승자입니다.

N=1N = 1이면 답은 0이므로, 이 과정을 N=1N = 1에서부터 역순으로 진행할 수 있습니다. 테스트 케이스 별로 O(N)\mathcal{O}(N) 시간이 소요됩니다.

Last updated on