#include "message.h"
#include <bits/stdc++.h>
#define eb emplace_back
#define mt make_tuple
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef vector<bool> arr;
namespace A {
const int N = 66;
const int M = 31;
int vs[N][M];
void send_message(arr M, arr C) {
int len = M.size();
M.resize(1025, 0);
for (int i = len + 1; i < 1025; i++) M[i] = 1;
vector<arr> res(66, arr(31, 0));
for (int i = 0; i < 31; i++) {
if (C[i]) continue;
int p = (i + 1) % 31;
while (C[p]) p = (p + 1) % 31;
int dis = (p - i + 31) % 31;
for (int k = 0; k < dis; k++)
vs[k][i] = 1, res[k][i] = (k == dis - 1);
}
int p = 0;
for (int i = 0; i < 31; i++) {
if (C[i]) continue;
for (int j = 0; j < 66; j++)
if (!vs[j][i]) res[j][i] = M[p++];
}
for (arr i : res) send_packet(i);
}
}
void send_message(arr M, arr C) {
A::send_message(M, C);
}
namespace B {
const int N = 66, M = 31;
int g[M], vs[N][M];
arr receive_message(vector<arr> R) {
for (int i = 0; i < 31; i++) {
for (int j = 0; j < 31; j++) {
if (R[j][i]) {
g[i] = (i + j + 1) % 31;
break;
}
}
}
arr C(31, 1);
for (int i = 0; i < 31; i++) {
int u = i; vector<int> c;
arr vs(31, 0);
while (!vs[u]) vs[u] = 1, c.eb(u), u = g[u];
if (c.size() == 16) {
for (int u : c) C[u] = 0;
break;
}
}
for (int i = 0; i < 31; i++) {
if (C[i]) continue;
int p = (i + 1) % 31;
while (C[p]) p = (p + 1) % 31;
int dis = (p - i + 31) % 31;
for (int k = 0; k < dis; k++)
vs[k][i] = 1;
}
arr res(1025);
int p = 0, len = 1025;
for (int i = 0; i < 31; i++) {
if (C[i]) continue;
for (int j = 0; j < 66; j++)
if (!vs[j][i]) res[p++] = R[j][i];
}
while (res[len - 1]) len--;
len--, res.resize(len);
return res;
}
}
arr receive_message(vector<arr> R) {
return B::receive_message(R);
}