#P6962. [NEERC 2017] Knapsack Cryptosystem

[NEERC 2017] Knapsack Cryptosystem

Description

Merkle-Hellman 背包密码系统是由 Ralph Merkle 和 Martin Hellman 于 1978 年发明的最早的公钥密码系统之一。以下是其描述:

Alice 选择 nn 个正整数 a1,...,an{a_{1}, . . . , a_{n}},使得每个 ai>j=1i1aja_{i} > \sum^{i-1}_{j=1}a_{j},一个大于所有 aia_{i} 之和的正整数 qq,以及一个与 qq 互质的正整数 rr。这 n+2n + 2 个整数是 Alice 的私钥。

然后 Alice 计算 bi=(air)b_i = (a_{i} \cdot r) mod qq。这 nn 个整数是 Alice 的公钥。

知道她的公钥后,Bob 可以向 Alice 传输一个 nn 位的消息。为此,他计算 ss,即在消息中第 ii 位为 1 的位置上对应的 bib_{i} 的和。这个值 ss 是加密后的消息。

注意,窃听者 Eve 知道加密消息和公钥,必须解决一个(可能很难的)背包问题实例才能找到原始消息。同时,在收到 ss 后,Alice 可以在线性时间内计算出原始消息;我们将其留给你作为练习。

在这个问题中,你需要处理 Merkle-Hellman 背包密码系统的实现,其中 Alice 选择了 q=264q = 2^{64},出于显而易见的性能原因,并公布了此信息。由于每个人都知道她的 qq,她要求 Bob 发送给她取模 2642^{64} 的计算值 ss 以简化通信。

你需要破解这个实现。给定公钥和一个加密消息,恢复原始消息。

Input Format

第一行包含一个整数 n(1n64)n (1 \le n \le 64)

接下来的 nn 行中,每行包含一个整数 bi(1bi<264)b_{i} (1 \le b_{i} < 2^{64})

最后一行包含一个整数 ss mod qq —— 取模 qq 的加密消息 ss,其中 0s0 \le s mod q<264q < 2^{64}

给定的序列 bib_{i} 是描述的实现中的有效公钥,给定的值 ss mod qq 是有效的加密消息。

Output Format

输出恰好 nn 位(0011 数字)——原始消息。

5
10
20
50
140
420
440

01001

Hint

时间限制:3 秒,内存限制:512 MB。

题面翻译由 ChatGPT-4o 提供。