#include "message.h"
#include <bits/stdc++.h>
#define all(a) (a).begin(), (a).end()
#define popcount(x) __builtin_popcountll(x)
using namespace std;
void send_message(vector<bool> message, vector<bool> C) {
message.push_back(1);
while (message.size() < 1025)
message.push_back(0);
vector<int> mine;
int jump[31];
for (int i = 0; i < 31; i++)
if (C[i] == 0)
mine.push_back(i);
for (int i = 0; i < 16; i++) {
jump[mine[i]] = (mine[(i + 1) % 16] - mine[i] + 31) % 31;
assert(jump[mine[i]] > 0);
}
int ptr = 0;
for (int i = 0; i < 66; i++) {
vector<bool> packet(31);
for (int j = 0; j < 31; j++) {
if (C[j]) continue;
if (i < jump[j] - 1)
packet[j] = 0;
else if (i == jump[j] - 1)
packet[j] = 1;
else
packet[j] = message[ptr++];
}
send_packet(packet);
}
}
vector<bool> receive_message(vector<vector<bool>> packets) {
int jump[31];
for (int j = 0; j < 31; j++) {
int i = 0;
while (i < 66 && packets[i][j] == 0)
i++;
jump[j] = i+1;
}
// return {};
vector<bool> C(31, 1);
for (int j = 0; j < 31; j++) {
int cur = j;
for (int iter = 0; iter < 16; iter++)
cur = (cur + jump[cur]) % 31;
if (cur == j)
C[j] = 0;
}
vector<bool> message;
for (int i = 0; i < 66; i++) {
for (int j = 0; j < 31; j++) {
if (C[j]) continue;
if (jump[j] <= i)
message.push_back(packets[i][j]);
}
}
// assert(message.size() == 1025);
int x = 0;
while (x == 0) {
x = message.back();
message.pop_back();
}
return message;
}