QOJ.ac

QOJ

Time Limit: 1.0 s Memory Limit: 512 MB Total points: 100 Communication

#8903. 비밀 메시지

Statistics

이 문제는 두 번 실행되는 문제이다. 각 테스트에서 제출한 프로그램은 두 번 실행된다.

정보 수업에서 Алеся와 Борис는 암호학을 배우고 있다. 두 사람은 자신들만의 메시지 암호화 방법을 만들기로 했다.

Алеся는 $1$부터 $n$까지의 서로 다른 정수 $k$개를 선택하고, 그 집합을 $T$라고 한다. Алеся는 집합 $T$를 암호화한 메시지로 Борис에게 보내고 싶다. 이를 위해 집합 $T$로부터 또 다른 집합 $R$을 만들어 Борис에게 보낸다. $R$ 역시 $1$부터 $n$까지의 정수로 이루어진다.

두 사람은 암호화 후 메시지의 크기가 달라지는 것을 원하지 않으므로, $R$에도 정확히 $k$개의 수가 있어야 한다. 또한 $T$와 $R$에 공통 원소가 하나라도 있으면 암호화가 충분히 안전하지 않다고 생각한다. 따라서 $T$와 $R$에 동시에 속하는 수가 없어야 한다. 즉, 두 집합은 서로소여야 한다. $k\le n/2$가 보장되므로, 집합 $T$에 대해 적어도 하나의 집합 $R$을 항상 만들 수 있다.

Борис는 암호화된 메시지 $R$을 받으면 이를 복호화하여 원래 메시지 $T$를 얻어야 한다.

Алеся와 Борис가 암호화 및 복호화 알고리즘을 만들고 구현하도록 도와주자. 첫 번째 실행에서 프로그램은 Алеся의 역할을 하고, 두 번째 실행에서는 Борис의 역할을 한다.

입력

첫 번째 줄에는 프로그램의 실행 번호를 나타내는 수 $a$가 주어진다. 이 수는 $1$ 또는 $2$이다.

두 번째 줄에는 프로그램이 암호화하거나(첫 번째 실행) 복호화해야 하는(두 번째 실행) 메시지의 개수 $m$이 주어진다($1\le m\le300\,000$).

다음 $2m$개의 줄에는 $m$개의 메시지가 주어지며, 각 메시지는 두 줄로 이루어진다.

각 메시지의 첫 번째 줄에는 두 정수 $n_i$와 $k_i$가 주어진다($2\le n_i\le10^9$, $1\le k_i\le300\,000$, $k_i\le\frac{n_i}{2}$). 두 번째 줄에는 $1$부터 $n_i$까지의 서로 다른 정수 $k_i$개가 오름차순으로 주어진다.

한 테스트에서 모든 $k_i$의 합은 $300\,000$을 넘지 않음이 보장된다.

$a=1$이면 주어진 수들은 원래 메시지이다. $a=2$이면 주어진 수들은 첫 번째 실행에서 프로그램이 어떤 메시지를 암호화한 결과이다.

출력

프로그램은 $m$개의 줄을 출력해야 한다. $i$번째 줄에는 $1$부터 $n_i$까지의 서로 다른 정수 $k_i$개를 오름차순으로 출력해야 한다.

첫 번째 실행에서는 각 원래 메시지 $T_i$에 대해 $T_i$와 서로소인 집합 $R_i$를 출력해야 한다.

두 번째 실행에서는 각 암호화된 메시지 $R_i$에 대해 원래 메시지 $T_i$를 복원해야 한다.

예제

첫 번째 실행

입력 1

1
2
2 1
1
5 2
1 4

출력 1

2
2 3

두 번째 실행

입력 2

2
2
5 2
2 3
2 1
2

출력 2

1 4
1

참고

예제에는 첫 번째 실행의 출력과 두 번째 실행의 입력으로 가능한 특정 경우가 제시되어 있음에 유의하자. 프로그램이 다른 집합 $R$을 출력하면 두 번째 실행의 입력도 달라진다.

또한 두 번째 실행에서 암호화된 메시지들이 프로그램에 주어지는 순서는 첫 번째 실행에서의 순서와 반드시 같지는 않다.

서브태스크

입력에 대한 추가 제한을 나타내기 위해, 집합 $T_i$를 이루는 수열을 $t_1,t_2,\ldots,t_{k_i}$라고 하자. 이 수들은 오름차순으로 정렬되어 있다.

한 테스트에서 $n_i$의 합을 $N$이라고 하자.

한 테스트에서 $k_i$의 합을 $K$라고 하자.

서브태스크 배점 추가 제한: $n_i,N$ 추가 제한: $k_i,K$ 추가 제한: $t_j$ 필요한 서브태스크 채점 정보
$1$ $9$ $N\le5000$ $k_i=1$ 첫 번째 오류
$2$ $11$ $N\le5000$ $k_i=2$ 첫 번째 오류
$3$ $9$ $N\le300\,000$ $k_i=\frac{n_i}{2}$ 첫 번째 오류
$4$ $7$ $n_i\le7$, $N\le5000$ 예제 첫 번째 오류
$5$ $9$ $t_{j+1}-t_j\ge2$, $t_{k_i}\le n_i-1$ 첫 번째 오류
$6$ $9$ $t_{k_i}-t_1\le\frac{n_i}{2}-1$ 첫 번째 오류
$7$ $10$ $N \le 5000$ $t_{k_i}\le n_i-k_i$ 첫 번째 오류
$8$ $12$ $N\le100$ 예제 첫 번째 오류
$9$ $3$ $N\le5000$ 예제, $1$–$2$, $4$, $7$–$8$ 첫 번째 오류
$10$ $7$ $N \le 300\,000$ 예제, $1$–$4$, $7$–$9$ 첫 번째 오류
$11$ $7$ $K\le5000$ 예제, $1$–$2$, $4$, $7$–$9$ 첫 번째 오류
$12$ $7$ 추가 제한 없음 예제, $1$–$11$ 첫 번째 오류

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.