Alice 和 Bob 被无辜地判处在一家高度戒备的监狱中服刑。现在他们必须计划逃跑。为此,他们需要能够尽可能高效地进行通信(特别是,Alice 需要每天向 Bob 发送信息)。然而,他们无法见面,只能通过写在餐巾纸上的纸条来传递信息。
每天,Alice 都想给 Bob 发送一条新信息——一个介于 $0$ 和 $N - 1$ 之间的数字。每次午餐时,Alice 会得到三张餐巾纸,并在每张餐巾纸上写下一个介于 $0$ 和 $M - 1$ 之间的数字(可以重复),然后将它们留在她的座位上。接着,他们的敌人 Charly 会销毁其中一张餐巾纸,并将剩下的两张混在一起。最后,Bob 找到了剩下的两张餐巾纸,并阅读上面的数字。他必须准确地解码出 Alice 想要发送给他的原始数字。
由于餐巾纸上的空间有限,因此 $M$ 是固定的。然而,Alice 和 Bob 的目标是最大化信息吞吐量,因此他们可以自由选择尽可能大的 $N$。请通过为他们两人分别实现一种策略来帮助 Alice 和 Bob,并尝试最大化 $N$ 的值。
实现细节
由于这是一个通信问题,您的程序将在两个独立的执行过程(一个用于 Alice,一个用于 Bob)中运行,它们之间除了此处描述的方式外,无法以任何方式共享数据或进行通信。您需要实现以下三个函数:
int setup(int M);
该函数将在 Alice 的程序执行开始时被调用一次,并在 Bob 的程序执行开始时也被调用一次。它被传入 $M$,并且必须返回期望的 $N$。两次对 setup 的调用必须返回相同的 $N$。
std::vector<int> encode(int A);
该函数实现 Alice 的策略。它在调用时会被传入要编码的数字 $A$($0 \le A < N$),并且必须返回三个编码 $A$ 的数字 $W_1, W_2, W_3$($0 \le W_i < M$)。该函数总共会被调用 $T$ 次——每天一次(不同天之间的 $A$ 值可能会重复)。
int decode(int X, int Y);
该函数实现 Bob 的策略。它在调用时会被传入 encode 返回的三个数字中的两个(以某种顺序)。它必须返回与 encode 接收到的相同的 $A$ 值。该函数也将被调用 $T$ 次——与对 encode 的 $T$ 次调用相对应;它们的顺序将保持一致。所有对 encode 的调用都将在对 decode 的调用之前发生。
数据范围
- $M \le 4300$
- $T = 5000$
评分
对于某个特定的子任务,你获得的得分比例 $S$ 取决于该子任务中所有测试点上 setup 返回的最小 $N$。它还取决于 $N^*$,即该子任务获得满分所需的 $N$ 的目标值:
- 如果你的解决方案在任何测试点上失败,则 $S = 0$。
- 如果 $N \ge N^*$,则 $S = 1.0$。
- 如果 $N < N^*$,则 $S = \max \left( 0.35 \max \left( \frac{\log(N) - 0.985 \log(M)}{\log(N^*) - 0.985 \log(M)}, 0.0 \right)^{0.3} + 0.65 \left( \frac{N}{N^*} \right)^{2.4}, 0.01 \right)$。
子任务
| 子任务 | 分数 | $M$ | $N^*$ |
|---|---|---|---|
| 1 | 10 | 700 | 82017 |
| 2 | 10 | 1100 | 202217 |
| 3 | 10 | 1500 | 375751 |
| 4 | 10 | 1900 | 602617 |
| 5 | 10 | 2300 | 882817 |
| 6 | 10 | 2700 | 1216351 |
| 7 | 10 | 3100 | 1603217 |
| 8 | 10 | 3500 | 2043417 |
| 9 | 10 | 3900 | 2536951 |
| 10 | 10 | 4300 | 3083817 |
样例
考虑以下 $T = 5$ 的示例。这里我们有一种编码方案:Alice 发送三个相同的数字来编码 $0$,或者发送三个不同的数字来编码 $1$。请注意,Bob 可以从 Alice 发送的三个数字中的任意两个中解码出原始数字。
| 执行端 | 函数调用 | 返回值 |
|---|---|---|
| Alice | setup(10) |
2 |
| Bob | setup(10) |
2 |
| Alice | encode(0) |
{5, 5, 5} |
| Alice | encode(1) |
{8, 3, 7} |
| Alice | encode(1) |
{0, 3, 1} |
| Alice | encode(0) |
{7, 7, 7} |
| Alice | encode(1) |
{6, 2, 0} |
| Bob | decode(5, 5) |
0 |
| Bob | decode(8, 7) |
1 |
| Bob | decode(3, 0) |
1 |
| Bob | decode(7, 7) |
0 |
| Bob | decode(2, 0) |
1 |
样例评测程序
对于样例评测程序,所有对 encode 和 decode 的调用都将在您程序的同一次执行中进行。此外,setup 将仅被调用一次(而在评测系统中,它会在每次执行时各被调用一次,共两次)。
输入仅为一个整数 $M$。然后它将输出您的 setup 返回的 $N$。接着,它将按照此顺序调用 encode 和 decode 函数 $T$ 次,其中传入的数字是在 $0$ 到 $N - 1$ 之间随机生成的,并且会随机选择将 encode 返回的三个数字中的哪两个(以及以何种顺序)传给 decode。如果您的解决方案失败,它将输出错误信息。