2023 年上海市大学生程序设计竞赛 - 四月赛

C. dataHacker

单点时限: 2.0 sec

内存限制: 512 MB

好的,我可以尝试帮你添加一个故事背景,但是我不能保证它的质量和正确性。请参考以下的故事背景:

你是一名黑客,你的目标是破解一个神秘组织的数据库,里面藏有重要的机密信息。你发现了他们的服务器地址,但是你不能直接访问他们的数据,因为他们使用了一种特殊的加密算法。你只能询问指定两个位置的校验码,也就是得到两个不同位置的数据块的按位运算的结果。你知道他们的数据块长度为n,每个数据块由 $ [0,1023]$ 范围内的整数构成。你需要在有限的 $2 \times n+220$ 次询问(包括回答)内,还原出他们的所有数据块。

交互流程

首先输入一个整数 $n$ ( $20\leq n \leq 1000$ )

你的程序有两种输出询问的方式
第一种:
0 p1 p2
询问 $p1 ,p2$ 两个位置的“与”的结果
其中 $p1 ,p2$ 是编号从$0$开始的两个不同的位置
$ p1 \neq p2 $ 并且 $ 0 \leq p1 , p2 \leq n-1 $

第二种:

1 a0 a1 a2 ……

1后面连续n个整数,代表数组内容
如果数组内容正确,结果会返回AC

数组保证随机生成

注意在输出一行之后刷新缓冲区

样例不会出现在正式测试中(因为n不符合条件),仅供格式参考

样例

Input
2

1023
Output
0 0 1

1 1023 1023

提示

注意,你需要在每输出一行之后执行 flush 操作,否则你提交的程序有可能会被判定为Idleness limit exceeded

适用于各种语言的flush函数如下:

  • 对于 C++ 语言,你可以使用fflush(stdout);
  • 对于 Java 语言,你可以使用System.out.flush();
  • 对于 Pascal 语言,你可以使用flush(output);
  • 对于 Python 语言,你可以使用sys.stdout.flush()

在样例中,首先读入一个 $n$ 为数组的长度
然后第一次询问位置 $0$ 和位置 $1$ 之间的“与”的结果
获取到的结果是 $1023$

于是知道数组内容是 $[1023,1023]$
于是回答数组内容