题目背景
这是一道 IO 交互题。
题目描述
我们随机了三个数 R0,R1,R2,并按以下规则生成了整个 R 序列:
Rn=Rn−2⊕Rn−1
其中 ⊕ 为异或运算。
此外我们有一个函数 M,其是一个双射,即我们保证对于 x=y,M(x)=M(y)。
您的目标是,经过多次询问后,确定 R0,R1,R2,M(0),M(1),…,M(255)。
交互方式
你的程序应从标准输入中读入,向标准输出中输出。
您可以向标准输出中输出一个整数 A,如果这是您的第 N 次询问,您将会读入:
M(A⊕RN−1)
如果您已经得到了所有答案,请输出一行字符串 SOLUTION
,然后输出 259 行,分别是 R0,R1,R2,M(0),M(1),…,M(255)。
记得在输出每一行后清空缓冲区!
提示
样例
(因为样例组不好表示所以放到这里)
我们人为规定 R0=0,R1=1,R2=3,M(i)=(i+1)mod256。
可得 R3=1。
输出 |
输入 |
解释 |
10 |
11 |
M(10⊕0)=M(10)=11 |
12 |
M(10⊕1)=M(11)=12 |
11 |
9 |
M(11⊕3)=M(8)=9 |
12 |
14 |
M(12⊕1)=M(13)=14 |
… |
|
省略了一部分输出 |
SOLUTION |
数据范围及限制
对于 100% 的数据,保证输入的数、输出的数、R 数组、M(x) 中的 x 与 M(x) 均 ≥0 且 ≤255。
计分策略
如果您输出的数并不在上述范围内,您保龄。
您的询问次数需要少于 320,否则,您保龄。
提示
清空缓冲区的方法:
C:
printf("%d\n", q);
fflush(stdout);
C++:
cout<<q<< '\n';
cout.flush();
Pascal:
writeln(q);
flush(output);
说明
本题译自 Balkan Olympiad in Informatics 2011 Day 1 T2 decrypt。
感谢
https://www.luogu.com.cn/user/60864
交互库。