#include <bits/stdc++.h>
using namespace std;
namespace{
bool adjmat[3][3][3][3];
vector<pair<pair<int,int>,pair<int,int>>> equiv =
{
{{0,0},{1,1}},
{{0,0},{2,1}},
{{0,0},{1,0}},
{{1,0},{1,1}},
{{1,0},{2,2}},
{{1,0},{2,1}},
{{1,0},{2,0}}
};
void load(vector<pair<pair<int,int>,pair<int,int> >> v){
for(int i = 0; i <= 2; i++){
for(int j = 0; j <= 2; j++){
for(int k = 0; k <= 2; k++){
for(int l = 0; l <= 2; l++){
adjmat[i][j][k][l] = false;
}
}
}
}
for(pair<pair<int,int>, pair<int,int>> ii : v){
pair<int,int> ii1 = ii.first;
pair<int,int> ii2 = ii.second;
adjmat[ii1.first][ii1.second][ii2.first][ii2.second] = true;
adjmat[ii2.first][ii2.second][ii1.first][ii1.second] = true;
}
}
void rotate(vector<pair<pair<int,int>,pair<int,int>>> &v){
for(pair<pair<int,int>,pair<int,int>> &ii : v){
int temp = ii.first.first;
ii.first.first = ii.first.second;
ii.first.second = 2 - temp;
temp = ii.second.first;
ii.second.first = ii.second.second;
ii.second.second = 2 - temp;
}
}
vector<int> decode(){
vector<int> temp;
for(int i = 0; i < 4; i++){
int num = 0;
for(int j = 0; j < 7; j++){
pair<int,int> f = equiv[j].first;
pair<int,int> s = equiv[j].second;
if(adjmat[f.first][f.second][s.first][s.second]){
num += (1<<j);
}
}
temp.push_back(num);
rotate(equiv);
}
return temp;
}
}
vector<pair<pair<int, int>, pair<int, int>>> BuildPattern(int N){
vector<pair<pair<int,int>,pair<int,int>>> v;
for(int i = 0; i <= 2; i++){
for(int j = 0; j <= 2; j++){
for(int k = i; k <= 2; k++){
for(int l = (k==i) * (j+1) ; l <= 2; l++){
int dx = abs(k - i);
int dy = abs(j - l);
if(__gcd(dx,dy) != 1) continue;
v.push_back({{i,j},{k,l} });
}
}
}
}
int ans = 0;
vector<int> code = {-1,-1,-1,-1};
for(int i = 0; i < (1<<7); i++){
for(int j = 0; j <= i; j++){
if(ans + i * i >= N){
int temp = N - ans - 1;
code = {i,j,temp / i, temp % i};
break;
}
ans += i * i;
if(ans + j + 1 >= N){
code = vector<int>{i,j,i,N - ans - 1};
break;
}
ans += j + 1;
}
if(code[0] != -1) break;
}
vector<pair<pair<int,int>,pair<int,int>>> vec;
for(int i = 0; i < 4; i++){
for(int j = 0; j < 7; j++){
if((1<<j)&code[i]) vec.push_back(equiv[j]);
}
rotate(equiv);
}
return vec;
}
int GetCardNumber(vector<std::pair<std::pair<int, int>, std::pair<int, int>>> p){
pair<vector<int>,int> ii = {{-1,-1,-1,-1},-1};
for(int i = 0; i < 4; i++){
load(p);
ii = max(make_pair(decode(),i),ii);
rotate(p);
}
int ans = 0;
bool done = false;
for(int i = 0; i < (1<<7); i++){
for(int j = 0; j <= i; j++){
if(ii.first[0] == i && ii.first[1] == j){
if(ii.first[2] < i){
ans += ii.first[2] * i + ii.first[3] + 1;
done = true;
}
else{
ans += i * i;
ans += ii.first[3] + 1;
done = true;
}
}
if(done) break;
ans += i * i;
ans += j + 1;
}
if(done) break;
}
return ans;
}
/*
int main(){
vector<pair<pair<int,int>,pair<int,int>>> v;
v = BuildPattern(1);
for(pair<pair<int,int>,pair<int,int>> ii : v) printf("%d %d %d %d\n",ii.first.first,ii.first.second, ii.second.first,ii.second.second);
printf("%d\n",GetCardNumber(v));
}*/