CF1994H.Fortnite

NOI/NOI+/CTSC

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是一个交互题!

Timofey 正在编写一场名为 Capture the Flag(简称 CTF)的比赛。他还剩下最后一道题,这道题涉及到破解一个安全系统。整个系统基于多项式哈希 ∗^{\text{∗}}。

Timofey 可以向系统输入一个由小写拉丁字母组成的字符串,系统会返回它的多项式哈希值。为了破解系统,Timofey 需要找出系统使用的多项式哈希参数(pp 和 mm)。

Timofey 时间不多了,所以他最多只能进行 33 次查询。请你帮助他完成这道题。

∗^{\text{∗}} 一个长度为 nn 的小写拉丁字母字符串 ss 的多项式哈希值,基于 pp 并对 mm 取模,定义为 (ord(s1)⋅p0+ord(s2)⋅p1+ord(s3)⋅p2+…+ord(sn)⋅pn−1) mod m(\mathrm{ord}(s_1) \cdot p^0 + \mathrm{ord}(s_2) \cdot p^1 + \mathrm{ord}(s_3) \cdot p^2 + \ldots + \mathrm{ord}(s_n) \cdot p^{n-1}) \bmod m。其中 sis_i 表示字符串 ss 的第 ii 个字符,ord(chr)\mathrm{ord}(\mathrm{chr}) 表示字符 chr\mathrm{chr} 在英文字母表中的序号,x mod mx \bmod m 表示 xx 除以 mm 的余数。

输入格式

每组测试包含多个测试用例。第一行包含一个整数 tt(1≤t≤1031 \leq t \leq 10^3)——表示测试用例的数量。

保证系统使用的 pp 和 mm 满足条件:26<p≤5026 < p \leq 50 且 p+1<m≤2⋅109p + 1 < m \leq 2 \cdot 10^9。

输出格式

每次向系统查询时,输出 ? ss,其中 ss 是你想要查询哈希值的字符串,长度不超过 5050 个字符。系统会返回字符串 ss 的多项式哈希值。

输出答案时,输出 ! pp mm,其中 pp 是哈希的底数,mm 是模数。之后立即进入下一个测试用例。

你最多只能进行 33 次查询 ?,否则会得到 Wrong Answer 判定。

每次输出查询后,别忘了输出换行并刷新输出缓冲区。否则会收到 Idleness limit exceeded 判定。刷新缓冲区的方法如下:

  • C++:fflush(stdout) 或 cout.flush()
  • Java:System.out.flush()
  • Pascal:flush(output)
  • Python:stdout.flush()
  • 其他语言请查阅相关文档。

输入输出样例

  • 输入#1

    1
    
    32
    
    28

    输出#1

    ? aa
    
    ? yb
    
    ! 31 59

说明/提示

第一次查询的答案为 (ord(a)⋅310+ord(a)⋅311) mod 59=(1+1⋅31) mod 59=32(\mathrm{ord}(a) \cdot 31^0 + \mathrm{ord}(a) \cdot 31^1) \bmod 59 = (1 + 1 \cdot 31) \bmod 59 = 32。

第二次查询的答案为 (ord(y)⋅310+ord(b)⋅311) mod 59=(25+2⋅31) mod 59=28(\mathrm{ord}(y) \cdot 31^0 + \mathrm{ord}(b) \cdot 31^1) \bmod 59 = (25 + 2 \cdot 31) \bmod 59 = 28。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页