ps:problems:boj:5386
금화 게임
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 5386 |
문제명 | 금화 게임 |
레벨 | 플래티넘 4 |
분류 |
애드혹 |
시간복잡도 | O(1) |
사용한 언어 | Python |
제출기록 | 30840KB / 76ms |
최고기록 | 56ms |
해결날짜 | 2022/06/06 |
풀이
- 한무더기만으로 이루어져 있으므로 그런디수를 정확히 계산할 필요까지는 없다.
- K가 홀수인 경우, 1,K, K^2, …은 모두 홀수이다. 따라서 어떤 액션을 취하든, 남은 금화의 홀짝이 바뀌게 된다. 처음에 금화가 짝수개였다면, 선공이 액션을 취하고 나면 홀수개가 남게되고, 후공이 액션을 취하고 나면 짝수개가 남게 된다. 즉, 0개를 남겨야 이기는 이 게임에서 선공은 절대 이길수 없다. 정리하면 처음 금화가 홀수개면 선공아 승리할 방법이 없고, 짝수개면 선공이 항상 승리한다. 1개만 가져가면 된다.
- K가 짝수인 경우는 조금 더 복잡하다. 이경우는 그냥 손으로 계산해보고, 거기에서 패턴을 찾아야 한다.. 자기 차례에 금화의 수가 (K+1)의 배수이면 이길수 없다. N%(K+1)이 K라면 K개를 가져가서 남은 갯수를 (K+1)m 으로 만들면 이길수 있다. N%(K+1)이 K의 배수가 아니라면.. N%(K+1)의 홀짝성에 따라 달라진다. 저 값이 홀수라면 1개만 가져가는 것으로 이길수 있다. 저 값이 짝수라면 이길 방법이 없다.
- 위에 적은 것을 정리하면 결국 어떤 n에 대해서든 승리방법을 O(1)에 계산 가능하다.
코드
"""Solution code for "BOJ 5386. 금화 게임".
- Problem link: https://www.acmicpc.net/problem/5386
- Solution link: http://www.teferi.net/ps/problems/boj/5386
Tags: [Ad hoc]
"""
def main():
T = int(input())
for _ in range(T):
S, K = [int(x) for x in input().split()]
if K % 2 == 1:
print(S % 2)
else:
t = S % (K + 1)
print(K if t == K else t % 2)
if __name__ == '__main__':
main()
ps/problems/boj/5386.txt · 마지막으로 수정됨: 2022/06/08 01:39 저자 teferi
토론