luogu#P9477. [_-0 C] 猜数

    ID: 13448 远端评测题 1000~10000ms 2048MiB 尝试: 1 已通过: 1 难度: 7 上传者: 标签>交互题Special JudgeO2优化信息论概率论条件概率

[_-0 C] 猜数

题目背景

本质相同的代码原则上至多提交 3\bold{3} 次。

f\mathfrak{f} 和小 g\mathfrak{g} 在玩猜数游戏,但是因为风声太大,他们听不清楚对方说的话……

题目描述

评测机在区间 [1,n][1,n] 中等概率随机地选择一个整数 xx,你的任务是猜测这个数。

你可以每次给出一个 [1,n][1,n] 中的整数 yy,询问 yyxx 的大小关系。你最多可以询问 qq 次。

但是,由于某些原因,评测机有 p%p\% 的概率会出错。

具体地说:

  • 如果 y=xy=x,那么评测机返回 =
  • 如果 yxy\ne x,且当前已经是第 qq 次询问,那么评测机返回 !
  • 得到以上两种结果后,你应当停止询问。
  • 如果 y>xy>x,那么评测机有 (100p)%(100-p)\% 的概率返回 >,有 p%p\% 的概率返回 <
  • 如果 y<xy<x,那么评测机有 (100p)%(100-p)\% 的概率返回 <,有 p%p\% 的概率返回 >

每次询问,你需要向标准输出输出一个 [1,n][1,n] 中的整数,然后清空缓冲区

你可以使用如下语句来清空缓冲区:

  • 对于 C/C++:fflush(stdout)
  • 对于 C++:std::cout << std::flush
  • 对于 Java:System.out.flush()
  • 对于 Python:stdout.flush()
  • 对于 Pascal:flush(output)
  • 对于其他语言,请自行查阅对应语言的帮助文档。

特别的,对于 C++ 语言,在输出换行时如果你使用 std::endl 而不是 '\n',也可以自动刷新缓冲区。

然后你需要从标准输入中输入一个字符,代表评测机返回的结果。

输入格式

开始询问之前,一行,三个用空格分隔的整数 n,p,qn,p,q

对于每一次询问,一行,一个字符,一定是 =!>< 四者之一。

输出格式

对于每一次询问,一行,一个 [1,n][1,n] 中的整数。

100 0 10

>

<

=

50

25

37
100 10 10

<

<

=

50

25

37
100 0 2

>

!

50

25

提示

样例 11 解释:

此时该测试点的状态为 AC

样例 22 解释:

x=37,y=50x=37,y=50 时,y>xy>x,有 10%10\% 的概率输出 <,恰好输出了 <

样例 33 解释:

此时该测试点的状态为 WA

本题采用捆绑测试。

每个 Subtask 下设有 55 个测试点,你只需通过其中至少 33测试点即可得到该 Subtask 对应的分数。

本题不使用子任务依赖。

对于所有数据,n=1018n=10^{18}

编号 分值 p=p= q=q= 时限
00 55 00 6060 1s\texttt{1s}
11 1010 1010 500500
22 2525 20002000
33 1515 10001000
44 2020 700700
55 1010 400400
66 4040 25002500
77 4545 1000010000
88 55 4848 6250062500 3s\texttt{3s}
99 4949 250000250000 10s\texttt{10s}