P15205 [SWERC 2018] Mona Lisa

题目描述

卢浮宫博物馆收藏了一幅最著名的画作:蒙娜丽莎,由列奥纳多·达·芬奇在 16 世纪绘制。 这幅画被封闭在一个坚固的玻璃室中,只有输入四个不同键盘上的四个秘密密码才能打开。博物馆馆长认为这个系统坚不可摧,而你的任务就是证明她错了。 为了帮助你,一位朋友反向工程了这个系统。当在键盘上输入一个密码(用一个正整数 $C$ 表示)时,键盘会发送伪随机数生成器生成的第 $C$ 个值到中央计算机。中央计算机只考虑从四个键盘接收到的四个伪随机值的 $N$ 个最低有效位。它计算这些值的按位异或(XOR),如果结果为 0,则打开玻璃室。伪随机数生成器的描述见问题陈述末尾。 另一位朋友找到了每个键盘使用的伪随机种子。有了所有这些信息,你认为你可以检索到解锁蒙娜丽莎的四个秘密密码。

输入格式

输入包含两行,每行由空格分隔的整数组成: - 第一行包含整数 $N$。 - 第二行包含四个整数种子。 ### 伪随机数生成器 伪随机数生成器在每种编程语言中描述如下。你可以期望这个伪随机数生成器没有任何偏差。 #### C/C++ ```c typedef unsigned long long uint64; uint64 state[2] = { seed, seed ^ 0x7263d9bd8409f526 }; uint64 xoshiro128plus(uint64 s[2]) { uint64 s0 = s[0]; uint64 s1 = s[1]; uint64 result = s0 + s1; s1 ^= s0; s[0] = ((s0 > 9)) ^ s1 ^ (s1 28); return result; } ``` 伪随机序列的第 $i$ 个值是对 `state` 第 $i$ 次应用 `xoshiro128plus` 的结果。 #### Java ```java long[] state = { seed, seed ^ 0x7263d9bd8409f526L }; long xoshiro128plus(long[] s) { long s0 = s[0]; long s1 = s[1]; long result = s0 + s1; s1 ^= s0; s[0] = ((s0 >> 9)) ^ s1 ^ (s1 > 28); return result; } ``` 伪随机序列的第 $i$ 个值是对 `state` 第 $i$ 次应用 `xoshiro128plus` 的结果。 #### Python 2 / Python 3 ```python state = [seed, seed ^ 0x7263d9bd8409f526] def xoshiro128plus(s): s0, s1 = s result = (s0 + s1) % 2**64 s1 ^= s0 new_state = [(((s0 > 9)) ^ s1 ^ (s1 28)) % 2**64] return result, new_state ``` 以下循环从第一个值开始生成伪随机序列: ```python while True: result, state = xoshiro128plus(state) yield result ```

输出格式

输出应包含一行,内容为四个整数,即四个秘密密码,用单个空格分隔。每个密码必须小于 100,000,000。保证至少存在一个解。如果存在多个解,则所有解都将被接受。

说明/提示

#### 数据范围 - $1 \leq N \leq 50$; - 每个种子在 $0$ 到 $2^{64} - 1$ 之间。 翻译由 DeepSeek 完成