#include <bits/stdc++.h>
#include "cheat.h"
using namespace std;
#define fi first
#define sc second
#define sz(v) (int)v.size()
int dp[10] = {0, 48, 960, 16128, 261120, 4190208, 67092480}, val[10];
//DEPOIS DAR SWAP EM TODO OS PARES PARA QUE <
//TUDO SENTIDO ANTI-HORARIO
vector < vector< pair<pair<int, int>, pair<int, int>> > > lin = {
{ { {0,0}, {1,0} } , { {2,0}, {2,1} }, { {1,2}, {2,2} }, { {0,1}, {0,2} } },
{ { {0,0}, {0,1} } , { {1,0}, {2,0} }, { {2,1}, {2,2} }, { {0,2}, {1,2} } },
{ { {1,2}, {2,0} }, { {0,2}, {1,0} }, { {0,1}, {2,2} }, { {0,0}, {2,1} } },
{ { {0,2}, {2,1} }, { {0,1}, {2,0} }, { {0,0}, {1,2} }, { {1,0}, {2,2} } },
{ { {0,0}, {1,1} } , { {1,1}, {2,0} }, { {1,1}, {2,2} }, { {0,2}, {1,1} } },
{ { {1,0}, {2,1} } , { {1,2}, {2,1} }, { {0,1}, {1,2} }, { {0,1}, {1,0} } },
{ { {1,0}, {1,1} } , { {1,1}, {2,1} }, { {1,1}, {1,2} }, { {0,1}, {1,1} } },
};
vector< pair<pair<int, int>, pair<int, int>> > pat;
void codifica(int x, int g){
for(int i = 0; i < 4; i++)
if(x & (1<<i)){
pat.push_back( lin[g][i] );
}
}
void cyclic(int i){
int x = val[i]&8;
val[i] <<= 1;
if(x)val[i] -= 15; //-16 + 1
}
vector< pair<pair<int, int>, pair<int, int>> > BuildPattern(int n){
pat.clear();
int x = 805306368;
for(int i = 6; i >= 0; i--){
x/=16;
if(i!= 0 && 4*dp[i-1] > n){
int qual = n/dp[i-1];
if(qual == 0)codifica(0, i); //0000
else if(qual == 1)codifica(5, i); //0101
else if(qual == 2)codifica(10, i); //1010
else codifica(15, i); //1111
n -= dp[i-1]*qual;
}else{
n -= 4*dp[i-1];
x /= 3;
int qual = n/x;
if(qual == 0)codifica(1, i); //0001
else if(qual == 1)codifica(3, i); //0011
else codifica(7, i); //0111
n -= qual*x;
for(int j = 0; j < i; j++){
int num = 0;
for(int k = 3; k >= 0; k--)num += (n&(1<<k));
n /= (1<<4);
codifica(num,j);
}
break;
}
}
return pat;
}
int GetCardNumber(vector<pair<pair<int, int>, pair<int, int>>> p){
for(int i = 0; i < 7; i++) val[i] = 0;
for(int i = 0; i < sz(p); i++){
if(p[i].fi > p[i].sc)swap(p[i].fi, p[i].sc);
int achei = 0;
for(int j = 0; j < 7; j++){
for(int k = 0; k < 4; k++)
if(lin[j][k] == p[i]){
val[j] += (1<<k);
achei = 1; break;
}
if(achei)break;
}
}
int s = 0, id;
for(int i = 6; i >= 0; i--){
int b = __builtin_popcount(val[i]);
if(b == 0 || b == 4 || val[i] == 5 || val[i] == 10)continue;
if(b == 1){
while(val[i] != 1){cyclic(i); s++;}
}else if( b == 2){
while(val[i] != 3){cyclic(i); s++;}
}else {
while(val[i] != 7){cyclic(i); s++;}
}
id = i;
break;
}
for(int i = 0; i < 7; i++){
if(i == id)continue;
for(int j = 0; j < s; j++)cyclic(i);
}
int ans = 0, x = 1;
for(int i = 0; i < id; i++){
x *= 16;
ans += val[i]*(1<<(4*i));
}
if(val[id] == 3)ans += x;
else if(val[id] == 7)ans += 2*x;
ans += 4*dp[id-1];
for(int i = id+1; i < 7; i++){
if(val[i] == 5)ans += dp[i-1];
else if(val[i] == 10)ans += 2*dp[i-1];
else if(val[i] == 15)ans += 3*dp[i-1];
}
return ans;
}