#HK5430. 「OOI 2017 Day 2」来玩游戏吧?

「OOI 2017 Day 2」来玩游戏吧?

题目描述

题目译自 Open Olympiad in Informatics 2017 Day2 T4 「Поиграем? / Shall We Play a Game?

这是一道交互题。

1804 年,美国副总统亚伦·伯尔因一系列针对自己的侮辱性小册子,向纽约州州长候选人亚历山大·汉密尔顿发起决斗挑战。

但伯尔是一个理性的人,他明白即使在决斗中杀死汉密尔顿,他的名誉也会受损,政治生涯将就此终结。因此,双方决定通过玩游戏来解决争端。为了公平起见,他们决定玩 gg 局游戏。

每局游戏中,汉密尔顿会想出一个正整数 nn,伯尔则尝试猜测这个数字。对于任意正整数 xx,伯尔可以询问汉密尔顿在 11nn(包含两端)之间能被 xx 整除的数字占比。换句话说,当询问关于 xx 的信息时,他会得到表达式

nxn\frac{\left\lfloor\frac{n}{x}\right\rfloor}{n}

的值,并且汉密尔顿会以不可约分分数的形式返回结果(这里 r\left\lfloor r \right\rfloor 表示对实数 rr 向下取整)。

请帮助伯尔在预定数量的询问内找出答案。

交互方式

程序启动时,输入一个整数 gg (1g1000)(1 \leq g \leq 1000),表示汉密尔顿与伯尔之间的游戏局数。

对于每局游戏,固定了一个数字 qq (6q60)(6 \leq q \leq 60),表示单局游戏中允许的最大询问次数。保证 qq 次询问足够解决此问题。此数字不会传递给参赛者的程序,但不同子任务中对 qq 的限制在评分规则表格中列出。如果参赛者的程序在单局游戏中进行了超过 qq 次询问,则在该测试用例上将获得 Wrong answer 结果。

要进行询问,应输出字符串 X t\texttt{X}\ t,其中 tt (1t1018)(1 \leq t \leq 10^{18}) 是一个正整数,表示需要计算表达式

ntn\frac{\left\lfloor\frac{n}{t}\right\rfloor}{n}

的值。

对于每次询问,程序将收到两个以空格分隔的数字 aabb,表示该分数简化后的分子和分母;如果程序超过了询问次数限制,则会收到数字 1-1

如果程序确定了所猜数字,应输出字符串 N t\texttt{N}\ t,其中 tt (1t1018)(1 \leq t \leq 10^{18}) 是猜测的答案。如果答案正确,程序将收到字符串 Correct;如果答案错误,将收到字符串 Wrong

随后,程序将进入下一局游戏(如果还有游戏),否则应结束运行。

注意,如果收到数字 1-1 或字符串 Wrong,你必须立即终止程序。否则,测试系统的判定可能不正确,例如可能得到 Run-time errorTime limit exceeded 的结果!

保证每个测试用例中,猜想的数字在游戏开始时就已固定,不会因你的询问而改变。

2

1 2

3 10

1 5

1 5

1 10

1 10

0 1

Correct

1 1

0 1

Correct


X 2

X 3

X 5

X 4

X 6

X 10

X 11

N 10

X 1

X 2

N 1

在第一个样例中,g=2g = 2。样例展示了玩家如何通过询问猜测出第一局游戏中猜想的数字是 1010,第二局是 11。测试系统中第一个测试用例也使用了这些数字。

请严格遵守输出格式。每次输出后必须输出一个换行符,并刷新输出缓冲区——在 Pascal 或 Delphi 中使用 flush(output),在 C/C++ 中使用 fflush(stdout)cout.flush(),在 Python 中使用 sys.stdout.flush(),在 Java 中使用 System.out.flush()

数据范围与提示

详细子任务附加限制及分值如下表所示。其中子任务 00 是样例。

子任务 分值 附加限制 子任务依赖 备注
11 3030 q=60q=60
22 1010 q=30q=30 010 \sim 1
33 44 q=20q=20 020 \sim 2
44 44 q=15q=15 030 \sim 3
55 55 q=10q=10 040 \sim 4
66 55 q=9q=9 050 \sim 5
77 1111 q=8q=8 060 \sim 6
88 1010 q=7q=7 070 \sim 7
99 2121 q=6q=6 080 \sim 8