#include "prison.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
std::vector<std::vector<int>> devise_strategy(int N) {
int n = N;
int b = 3;
int c = 8; // b ^ c must be greater than n
int x = b * c - 2;
vector<vector<int>> s(x+1, vector<int>(n+1));
for (int i=0; i<=x; i++) {
int read = i > 0 ? (i == 1 ? 1 : i + 1) : b * c;
int bit = read / b;
int O = read % b;
if (bit & 1) {
int A = O;
s[i][0] = 1; // check B
for (int j=1; j<=n; j++) {
int B = j; for (int k=0; k<bit; k++) B /= b; B %= b;
int P = j; for (int k=1; k<bit; k++) P /= b; P %= b;
if (A == B) {
int write = (bit - 1) * b + P;
if (write == 2) {s[i][j] = -1; continue;}
if (write == 1) {s[i][j] = 1; continue;}
if (write == 0) {s[i][j] = -2; continue;}
if (write >= 0) s[i][j] = write - 1;
}else{
s[i][j] = A < B ? -1 : -2;
}
}
}else{
int B = O;
s[i][0] = 0; // check A
for (int j=1; j<=n; j++) {
int A = j; for (int k=0; k<bit; k++) A /= b; A %= b;
int P = j; for (int k=1; k<bit; k++) P /= b; P %= b;
if (A == B) {
int write = (bit - 1) * b + P;
if (write == 2) {s[i][j] = -2; continue;}
if (write == 1) {s[i][j] = 1; continue;}
if (write == 0) {s[i][j] = -1; continue;}
if (write >= 0) s[i][j] = write - 1;
}else{
s[i][j] = A < B ? -1 : -2;
}
}
}
}
// for (auto v: s) {
// for (int x: v) cout << x << " ";
// cout << "\n";
// }
return s;
}