#include <bits/stdc++.h>
#include <numeric>
using namespace std;
#define ff endl
#define lf "\n"
#define fi first
#define se second
#define _ << ' ' <<
#define all(x) begin(x),end(x)
#define rall(x) rbegin(x),rend(x)
#ifdef DEBUG
constexpr bool IS_DEBUG = 1;
#define infor(fmt, ...) do { print(stderr, fmt, ##__VA_ARGS__); } while(0)
#define infof(fmt, ...) do { println(stderr, fmt, ##__VA_ARGS__); } while(0)
#else
constexpr bool IS_DEBUG = 0;
#define infor(fmt, ...)
#define infof(fmt, ...)
#endif
using ll = long long;
using pll = pair<ll, ll>;
using pii = pair<int, int>;
template<typename... Args>
using vec = vector<Args...>;
constexpr int LOG = 4;
constexpr int MOD = 1e9+7;
constexpr int MAXN = 1e5+7;
mt19937 timmy_loves_gambling(73);
vector<bool> send_packet(vector<bool> A);
constexpr int N = 31;
constexpr int SZ = 16;
void send_message(vector<bool> M, vector<bool> C) {
vec<int> P(N);
for(int i = 0; i < N; ++i) {
if(C[i]) continue;
for(int j = i + 1; j != i; ++j) {
if(j == N) j -= N;
if(C[j]) {
P[i] += 1;
} else break;
}
}
vec<bool> p(N);
for(int lg = 0; lg < LOG; ++lg) {
for(int i = 0; i < N; ++i) {
p[i] = P[i]&1;
P[i] >>= 1;
}
(void)send_packet(p);
}
for(int i = 0; i < M.size();) {
for(int j = 0; j < N; ++j) {
if(C[j]) continue;
p[j] = M[i++];
}
(void)send_packet(p);
}
int len = M.size();
int j = 0;
for(int i = N - 1; i >= 0; i--) {
if(C[i]) continue;
p[i] = len&1;
len >>= 1;
}
(void)send_packet(p);
}
vector<bool> receive_message(vector<vector<bool>> R) {
vec<int> P(N);
for(int lg = LOG - 1; lg >= 0; lg--) {
for(int i = 0; i < N; ++i) {
P[i] <<= 1;
P[i] += R[lg][i];
}
}
vec<bool> C(N);
for(int i = 0; i < N; ++i) {
vec<bool> vis(N);
for(int j = i; vis[j] == 0; j = (j + P[j] + 1) % N) vis[j] = 1;
C[i] = accumulate(all(vis), 0) != SZ;
}
vec<bool> S; S.reserve(SZ * (R.size() - LOG - 1));
for(int i = LOG; i < R.size() - 1; ++i) {
for(int j = 0; j < N; ++j) {
if(C[j]) continue;
S.emplace_back(R[i][j]);
}
}
int len = 0;
for(int i = 0; i < N; ++i) {
if(C[i]) continue;
len <<= 1;
len += R.back()[i];
}
S.resize(len);
return S;
}
#ifdef LOCAL
namespace {
const int PACKET_SIZE = 31;
const int CALLS_CNT_LIMIT = 100;
int calls_cnt;
std::vector<bool> C(PACKET_SIZE);
std::vector<std::vector<bool>> R;
void quit(const char* message) {
printf("%s\n", message);
exit(0);
}
void run_scenario() {
R.clear();
calls_cnt = 0;
int S;
assert(1 == scanf("%d", &S));
std::vector<bool> M(S);
for (int i = 0; i < S; i++) {
int bit;
assert(1 == scanf("%d", &bit));
assert((bit == 0) || (bit == 1));
M[i] = bit;
}
for (int i = 0; i < PACKET_SIZE; i++) {
int bit;
assert(1 == scanf("%d", &bit));
assert((bit == 0) || (bit == 1));
C[i] = bit;
}
send_message(M, C);
std::vector<bool> D = receive_message(R);
int K = (int)R.size();
int L = (int)D.size();
printf("%d %d\n", K, L);
for (int i = 0; i < L; i++)
printf("%s%d", (i == 0 ? "" : " "), (D[i] ? 1 : 0));
printf("\n");
}
std::vector<bool> taint(const std::vector<bool>& A) {
std::vector<bool> B = A;
bool bit = 0;
for (int i = 0; i < PACKET_SIZE; i++)
if (C[i] == 1) {
B[i] = bit;
bit = !bit;
}
return B;
}
} // namespace
std::vector<bool> send_packet(std::vector<bool> A) {
calls_cnt++;
if (calls_cnt > CALLS_CNT_LIMIT)
quit("Too many calls");
if ((int)A.size() != PACKET_SIZE)
quit("Invalid argument");
std::vector<bool> B = taint(A);
R.push_back(B);
return B;
}
int main() {
int T;
assert(1 == scanf("%d", &T));
for (int i = 1; i <= T; i++)
run_scenario();
}
#endif