BOJ 30762 Shall We Play a Game?
문제 내용
정수 알아맞히기 게임을 하려고 합니다. 당신의 상대는 1 이상 이하의 정수 을 숨기고 있습니다. 당신은 다음의 쿼리를 6번 이하로 하여 의 값을 알아내야 합니다.
X x: 1 이상 이하의 정수 를 쿼리합니다. 상대는 1 이상 이하의 정수 중에서 의 배수의 개수의 비율, 즉 의 값을 기약분수 형태로 당신에게 알려줍니다.
인터랙션
먼저, 플레이할 게임의 수 가 주어집니다. ()
각 게임에 대해, 당신의 프로그램은 X {x의 값}을 출력하여 쿼리를 할 수 있습니다. 인터랙터는 그 결과로 나오는 분수를 {분자} {분모}의 형태로 당신의 프로그램의 입력으로 전달합니다.
쿼리의 형식이 올바르지 않거나, 의 값이 범위 밖에 있거나, 쿼리 횟수를 초과했다면 -1을 대신 전달합니다.
의 값을 알아냈다면, N {n의 값}을 출력합니다. 이 출력은 쿼리 횟수에 포함되지 않습니다. 인터랙터는 그 값이 맞다면 Correct, 아니라면 Wrong을 전달합니다. Correct라면 다음 게임을 진행하면 됩니다.
모든 출력 이후에는 flush를 하여야 합니다.
-1이나 Wrong을 받았거나, 모든 게임이 종료되었다면 즉시 프로그램을 종료해야 합니다. 그렇지 않으면 TLE, RTE 등의 예상치 못한 채점 결과를 받을 수 있습니다.
문제 풀이
스포일러
하나의 쿼리 를 넣었을 때 나올 수 있는 결과는 다음과 같습니다.
- 이면 0이 나옵니다.
- 이면 가 나옵니다.
- 이면 을 약분한 결과가 나옵니다.
세 번째 결과에 대해, 다음의 사실을 관찰할 수 있습니다.
- 이려면, 여야 합니다.
그런데 의 범위는 한정되어 있으므로, 이러한 결과가 주어졌을 때 가능한 답은 최대 가지가 있으며, 그 중 최솟값을 이라고 했을 때 이들은 모두 의 배수입니다. 일 때 를 구하려면, 을 쿼리하여 나오는 답 을 보면 바로 알 수 있습니다. 이는 인 경우에도 마찬가지로 처리할 수 있습니다.
이제 이를 이용하여, 를 0이 아닌 수가 나올 때까지 순서대로 쿼리한 뒤 하나의 쿼리를 추가하여 문제를 풀 수 있습니다. 4를 넣었을 때도 0이 나왔다면, 2를 넣음으로써 중 무엇이 나오는지 확인하면 됩니다.