배낭 암호 체계

q = 2^64인 Merkle-Hellman 배낭 암호에서 공개키와 암호문이 주어질 때, 알려진 모듈러스를 이용해 원래 메시지 비트를 복원한다.

어려움8정수론완전 탐색비트 연산수학아직 제출이 없습니다시간 제한3초메모리 제한512 MB

문제

머클-헬만 배낭 암호 체계는 가장 이른 시기의 공개 키 암호 방식 가운데 하나다. 랄프 머클과 마틴 헬만이 1978년에 발표했다. 방식은 다음과 같다.

앨리스는 모든 ii에 대해 ai>j=1i1aja_i > \sum_{j=1}^{i-1} a_j를 만족하는 양의 정수 nna1,,ana_1, \dots, a_n과, a1++ana_1 + \dots + a_n보다 큰 양의 정수 qq, 그리고 qq와 서로소인 양의 정수 rr를 고른다. 이 n+2n + 2개의 정수가 앨리스의 개인 키다.

이어서 앨리스는 bi=(air)modqb_i = (a_i \cdot r) \bmod q를 계산한다. 이 nn개의 정수가 앨리스의 공개 키다.

밥은 공개 키만 알아도 앨리스에게 nn비트짜리 메시지를 보낼 수 있다. 밥은 자기 메시지의 ii번째 자리가 1인 인덱스 iibib_i를 모두 더해 ss를 계산한다. 이 값 ss가 암호문이다.

공개 키와 암호문을 아는 도청자 이브는 원래 메시지를 알아내려면 어렵다고 알려진 배낭 문제를 풀어야 한다. 반면 앨리스는 ss를 받은 뒤 선형 시간에 원래 메시지를 복원한다.

이 문제에서 다루는 구현에서 앨리스는 속도를 위해 q=264q = 2^{64}로 정하고 이 사실을 공개했다. 모두가 qq를 알고 있으므로, 앨리스는 통신을 간단히 하려고 밥에게 ss2642^{64}로 나눈 나머지를 보내달라고 한다.

이 구현을 깨라. 공개 키와 암호문이 주어지면 원래 메시지를 복원하면 된다.

입력

첫째 줄에 정수 nn이 주어진다 (1n641 \le n \le 64).

다음 nn개 줄에 정수 bib_i가 한 줄에 하나씩 주어진다 (1bi<2641 \le b_i < 2^{64}).

마지막 줄에 암호문을 qq로 나눈 나머지 smodqs \bmod q가 주어진다 (0smodq<2640 \le s \bmod q < 2^{64}).

주어지는 수열 b1,,bnb_1, \dots, b_n은 위 구현의 올바른 공개 키이고, 주어지는 값은 올바른 암호문이다.

출력

원래 메시지의 비트를 순서대로 한 줄에 nn개 출력한다. 각 문자는 0 또는 1이다.

a1,,ana_1, \dots, a_n에서 고른 부분집합의 합이 서로 모두 다르므로, 입력과 맞는 메시지는 하나뿐이다.