#P16534. [Dapc2022]guessing primes

[Dapc2022]guessing primes

题目背景

你的朋友们最近沉迷于一款热门猜词游戏:玩家需要在六次机会内猜出一个五字母单词。

可惜,你并不擅长语言游戏;不过,你的数学水平远胜于朋友们。于是你改玩它的数学版本——Brave Alternative Primes Challenge。在这个游戏中,需要在六次猜测内找出一个隐藏的五位素数。

为了向朋友们证明自己的实力,你决定编写一个程序,使它能够稳定赢下每一局游戏。

题目描述

本题是一道交互题

每一局中,交互器会预先选定一个隐藏的五位素数,即一个满足

104p<10510^4 \le p < 10^5

的素数。隐藏素数在这一局内保持不变,交互器不会根据你的询问临时修改答案。

你每次需要输出一个五位素数作为猜测。交互器随后返回一个长度为 55 的字符串,其中第 ii 个字符对应你猜测数字的第 ii 位:

  • g(green,绿色):这一位数字及其位置都正确;
  • y(yellow,黄色):这一位数字出现在隐藏素数中尚未匹配的位置,但不在当前这个位置;
  • w(white,白色):这一位数字既没有被标为绿色,也无法再与隐藏素数中的同一数字匹配。

对于重复数字,每个隐藏数字的出现位置最多只能匹配一次。交互器按以下方式生成反馈:

  1. 先标记所有位置正确的数字为 g,并消耗隐藏素数中对应的出现次数;
  2. 再从左到右检查其余猜测位置:若该数字在隐藏素数尚未匹配的数字中仍有剩余,则标记为 y 并消耗一次;否则标记为 w

当交互器返回 ggggg 时,说明本局猜测成功。

交互格式

交互器首先向你的程序发送一行一个整数 nn

1n1000,1 \le n \le 1000,

表示需要进行的游戏局数。

对于每一局:

  1. 你的程序输出一行一个五位素数,表示本次猜测;
  2. 立即刷新输出缓冲区
  3. 交互器返回一行一个由 wyg 组成的长度为 55 的字符串;
  4. 若返回值为 ggggg,当前局结束并进入下一局;否则继续猜测。

每一局最多允许进行 6 次猜测

以下情况都会得到 Wrong Answer:

  • 某一局使用超过 66 次猜测;
  • 输出的数不是五位数;
  • 输出的数不是素数;
  • 没有按照要求刷新输出缓冲区,导致交互超时;
  • 完成全部游戏后继续输出额外内容。

交互示例

下面仅用于展示交互过程,其中:

  • < 开头的行由交互器发送;
  • > 开头的行由选手程序输出。
< 2
> 54323
< ywyww
> 98737
< wwwyg
> 31583
< gggww
> 31517
< ggggg
> 99991
< wwwwy
> 44449
< wgwgw
> 14143
< ggggg

交互示例不代表固定的隐藏素数,也不限制你必须采用这些猜测。

本地测试

附件中提供:

  • testing_tool.py:本地交互测试工具;
  • sample.in:一组本地隐藏数据。

例如,若你的 C++ 程序编译为 main,可以使用:

python3 testing_tool.py -f sample.in ./main

本地输入文件的第一行是局数,之后每行给出一局的隐藏素数。该格式只供本地测试工具使用,正式评测时选手程序无法直接读取隐藏素数。

数据范围与评测说明

  • 游戏局数:1n10001 \le n \le 1000
  • 隐藏答案一定是五位素数;
  • 每局最多询问 66 次;
  • 正式数据共 1313 组,整体覆盖全部 83638363 个五位素数。