#include "encoder.h"
#include "encoderlib.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<typename T> using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
const int L = 100;
struct number {
unsigned char dig[L]; // base 256
// value is sum of dig[i] * 256 ^ i
number() {
for (int i = 0; i < L; i++) {
dig[i] = 0;
}
}
number(int n, int* digs) {
for (int i = 0; i < n; i++) {
dig[i] = digs[i];
}
for (int i = n; i < L; i++) {
dig[i] = 0;
}
}
unsigned char& operator[] (int pos) {
return dig[pos];
}
friend number operator+ (number& A, number& B) {
number res;
int carry = 0;
for (int i = 0; i < L; i++) {
res[i] = ((int)A[i] + B[i] + carry) & 255;
carry = ((int)A[i] + B[i] + carry) >> 8;
}
return res;
}
friend int operator<=> (number& A, number& B) {
for (int i = L-1; i >= 0; i--) {
if (A[i] != B[i]) {
return A[i] < B[i] ? -1 : 1;
}
}
return 0;
}
friend bool operator< (number A, number B) {
return A <=> B <= -1;
}
friend bool operator<= (number& A, number& B) {
return A <=> B <= 0;
}
friend bool operator> (number& A, number& B) {
return 1 <= A <=> B;
}
friend bool operator>= (number& A, number& B) {
return 0 <= A <=> B;
}
};
const int N = 700;
number dp[N][256];
int one[1];
void init() {
one[0] = 1;
for (int len = 1; len < N; len++) {
dp[len][0] = number(1, one);
for (int x = 1; x < 256; x++) {
dp[len][x] = dp[len][x-1] + dp[len-1][x];
}
}
}
void encode(int n, int* M) {
int res = 0;
for (int i = 0; i < n; i++) {
res |= M[i] << i;
}
send(res);
}
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<typename T> using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
const int L = 100;
struct number {
unsigned char dig[L]; // base 256
// value is sum of dig[i] * 256 ^ i
number() {
for (int i = 0; i < L; i++) {
dig[i] = 0;
}
}
number(int n, int* digs) {
for (int i = 0; i < n; i++) {
dig[i] = digs[i];
}
for (int i = n; i < L; i++) {
dig[i] = 0;
}
}
unsigned char& operator[] (int pos) {
return dig[pos];
}
friend number operator+ (number& A, number& B) {
number res;
int carry = 0;
for (int i = 0; i < L; i++) {
res[i] = ((int)A[i] + B[i] + carry) & 255;
carry = ((int)A[i] + B[i] + carry) >> 8;
}
return res;
}
friend int operator<=> (number& A, number& B) {
for (int i = L-1; i >= 0; i--) {
if (A[i] != B[i]) {
return A[i] < B[i] ? -1 : 1;
}
}
return 0;
}
friend bool operator< (number A, number B) {
return A <=> B <= -1;
}
friend bool operator<= (number& A, number& B) {
return A <=> B <= 0;
}
friend bool operator> (number& A, number& B) {
return 1 <= A <=> B;
}
friend bool operator>= (number& A, number& B) {
return 0 <= A <=> B;
}
};
const int N = 700;
number dp[N][256];
int one[1];
void init() {
one[0] = 1;
for (int len = 1; len < N; len++) {
dp[len][0] = number(1, one);
for (int x = 1; x < 256; x++) {
dp[len][x] = dp[len][x-1] + dp[len-1][x];
}
}
}
void decode(int n, int m, int* X) {
for (int i = 0; i < n; i++) {
output((X[0] >> i) & 1);
}
}