BOJ 30762 Shall We Play a Game?

BOJ 30762 Shall We Play a Game?

문제 링크:

문제 내용

정수 알아맞히기 게임을 하려고 합니다. 당신의 상대는 1 이상 101810^{18} 이하의 정수 nn을 숨기고 있습니다. 당신은 다음의 쿼리를 6번 이하로 하여 nn의 값을 알아내야 합니다.

  • X x: 1 이상 101810^{18} 이하의 정수 xx를 쿼리합니다. 상대는 1 이상 nn 이하의 정수 중에서 xx의 배수의 개수의 비율, 즉 nxn\frac{\left\lfloor \frac{n}{x} \right\rfloor}{n}의 값을 기약분수 형태로 당신에게 알려줍니다.

인터랙션

먼저, 플레이할 게임의 수 gg가 주어집니다. (1g10001 \le g \le 1000)

각 게임에 대해, 당신의 프로그램은 X {x의 값}을 출력하여 쿼리를 할 수 있습니다. 인터랙터는 그 결과로 나오는 분수를 {분자} {분모}의 형태로 당신의 프로그램의 입력으로 전달합니다. 쿼리의 형식이 올바르지 않거나, xx의 값이 범위 밖에 있거나, 쿼리 횟수를 초과했다면 -1을 대신 전달합니다.

nn의 값을 알아냈다면, N {n의 값}을 출력합니다. 이 출력은 쿼리 횟수에 포함되지 않습니다. 인터랙터는 그 값이 맞다면 Correct, 아니라면 Wrong을 전달합니다. Correct라면 다음 게임을 진행하면 됩니다.

모든 출력 이후에는 flush를 하여야 합니다. -1이나 Wrong을 받았거나, 모든 게임이 종료되었다면 즉시 프로그램을 종료해야 합니다. 그렇지 않으면 TLE, RTE 등의 예상치 못한 채점 결과를 받을 수 있습니다.

문제 풀이

스포일러

하나의 쿼리 xx를 넣었을 때 나올 수 있는 결과는 다음과 같습니다.

  • n<xn < x이면 0이 나옵니다.
  • n=qxn = qx이면 1x\frac{1}{x}가 나옵니다.
  • n=qx+r(1r<x)n = qx + r (1 \le r < x)이면 qqx+r\frac{q}{qx+r}을 약분한 결과가 나옵니다.

세 번째 결과에 대해, 다음의 사실을 관찰할 수 있습니다.

  • qqx+r=qqx+r\frac{q}{qx+r} = \frac{q'}{q'x+r'}이려면, rq=rq\frac{r}{q} = \frac{r'}{q'}여야 합니다.

그런데 rr의 범위는 한정되어 있으므로, 이러한 결과가 주어졌을 때 가능한 답은 최대 x1x - 1가지가 있으며, 그 중 최솟값을 x1x_1이라고 했을 때 이들은 모두 x1x_1의 배수입니다. n=kx1n = kx_1일 때 kk를 구하려면, x1+1x_1 + 1을 쿼리하여 나오는 답 k1kx1\frac{k-1}{kx_1}을 보면 바로 알 수 있습니다. 이는 n=qxn = qx인 경우에도 마찬가지로 처리할 수 있습니다.

이제 이를 이용하여, 232,216,28,24,222^{32}, 2^{16}, 2^{8}, 2^{4}, 2^{2}를 0이 아닌 수가 나올 때까지 순서대로 쿼리한 뒤 하나의 쿼리를 추가하여 문제를 풀 수 있습니다. 4를 넣었을 때도 0이 나왔다면, 2를 넣음으로써 0,12,130, \frac{1}{2}, \frac{1}{3} 중 무엇이 나오는지 확인하면 됩니다.

Last updated on