#CF1994H. Fortnite
Fortnite
Fortnite
时间限制:1 秒
空间限制:256 MB
这是一道交互题!
Timofey 正在举办一场名为 Capture the Flag(简称 CTF)的比赛。他还有一个任务需要完成,这个任务涉及入侵一个安全系统。整个系统基于多项式哈希∗。
Timofey 可以向系统输入一个由小写拉丁字母组成的字符串,系统会返回它的多项式哈希值。为了入侵系统,Timofey 需要找出系统所使用的多项式哈希参数( 和 )。
Timofey 没有太多时间了,所以他最多只能进行 3 次查询。请帮他完成这个任务。
∗ 对于长度为 的由小写拉丁字母组成的字符串 ,基于 且模 的多项式哈希值为:
$$( \operatorname{ord}(s_1) \cdot p^{0} + \operatorname{ord}(s_2) \cdot p^{1} + \dots + \operatorname{ord}(s_n) \cdot p^{n-1} ) \bmod m $$其中 表示字符串 的第 个字符, 表示字符 在英文字母表中的序号(a=1, b=2, …, z=26), 表示 除以 的余数。
输入格式
每个测试包含多个测试用例。第一行包含一个整数 ()—— 测试用例的数量。
保证系统使用的 和 满足条件: 且 。
交互方式
要向系统发出查询,请输出 ? s,其中 是一个长度不超过 的字符串,表示你想知道它的哈希值。在此查询的回复中,你将收到字符串 的多项式哈希值。
若要输出答案,请输出 ! p m,其中 是哈希的基数, 是模数。之后立即进入下一个测试用例。
你最多只能进行 3 次 ? 查询,否则你将得到 Wrong Answer。
输出查询后,别忘了输出换行符并刷新输出缓冲区。否则你将收到 Idleness limit exceeded。
样例输入
1
32
28
样例输出
? aa
? yb
! 31 59
样例解释
第一个查询的答案是 $(\operatorname{ord}(a) \cdot 31^0 + \operatorname{ord}(a) \cdot 31^1) \bmod 59 = (1 + 1 \cdot 31) \bmod 59 = 32$。
第二个查询的答案是 $(\operatorname{ord}(y) \cdot 31^0 + \operatorname{ord}(b) \cdot 31^1) \bmod 59 = (25 + 2 \cdot 31) \bmod 59 = 28$