单点时限: 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不符合条件),仅供格式参考
2 1023
0 0 1 1 1023 1023
请注意,你需要在每输出一行之后执行 flush
操作,否则你提交的程序有可能会被判定为Idleness limit exceeded
。
适用于各种语言的flush
函数如下:
fflush(stdout);
System.out.flush();
flush(output);
sys.stdout.flush()
在样例中,首先读入一个 $n$ 为数组的长度
然后第一次询问位置 $0$ 和位置 $1$ 之间的“与”的结果
获取到的结果是 $1023$
于是知道数组内容是 $[1023,1023]$
于是回答数组内容