사용자 도구

사이트 도구


ps:problems:boj:4370

곱셈 게임

ps
링크acmicpc.net/…
출처BOJ
문제 번호4370
문제명곱셈 게임
레벨골드 4
분류

게임 이론

시간복잡도O(logn)
인풋사이즈n<4294967295
사용한 언어Python 3.11
제출기록31256KB / 44ms
최고기록36ms
해결날짜2023/06/21

풀이

  • 각 숫자별로 승패 여부를 모두 따로따로 계산할 필요 없이, 숫자의 범위들에 대해서 승패를 계산해주는게 가능하다.
  • 9를 곱해서 n이상으로 만들수 있는 수는 모두 승리포지션이다. w0= ceil(n/9)이라고 하면, [w0, n-1] 범위의 수는 모두 승리포지션.
  • [ceil(w0/2), w0-1] 범위의 수들은 2~9중 어떤값을 곱하든 [w0, n-1] 범위로 들어간다. l0 = ceil(w0/2)이라고 하면, [l0,w0-1] 범위의 수들은 모두 패배 포지션
  • w1 = ceil(l0/9)라고 하면, [w1,l0-1] 범위의 수는 모두 9를 곱하면 [l0,w0-1] 범위로 들어간다. 패배포지션으로 이동시킬수 있는 액션이 있으므로, 이 수들은 모두 승리포지션.
  • 이런식으로 n을 9와 2로 번갈아서 나누어 보면서 w0,l0,w1,l1,w2,l2, … 을 구해나갈수 있다. 이중에서 시작포지션인 1을 포함하는 범위를 찾으면, 1이 승리포지션인지 패배포지션인지 찾을수 있다. 시간복잡도는 O(logn) 이 된다.

코드

"""Solution code for "BOJ 4370. 곱셈 게임".

- Problem link: https://www.acmicpc.net/problem/4370
- Solution link: http://www.teferi.net/ps/problems/boj/4370

Tags: [game theory]
"""

import sys


def main():
    for line in sys.stdin:
        n = int(line)
        while True:
            n = (n + 8) // 9
            if n <= 1:
                print('Baekjoon wins.')
                break
            n = (n + 1) // 2
            if n <= 1:
                print('Donghyuk wins.')
                break


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
S X J​ W C
 
ps/problems/boj/4370.txt · 마지막으로 수정됨: 2023/06/21 05:17 저자 teferi