#include <vector>
#include <algorithm>
#include <set>
using namespace std;
typedef pair<int, int> Point;
typedef pair<Point, Point> Edge;
// Цэгийг 90 градус эргүүлэх (x, y) -> (2-y, x)
Point rotatePoint(Point p) {
return {2 - p.second, p.first};
}
// Хэрчмийг эргүүлэх ба цэгүүдийг эрэмбэлэх
Edge rotateEdge(Edge e) {
Point a = rotatePoint(e.first);
Point b = rotatePoint(e.second);
if (a > b) swap(a, b);
return {a, b};
}
// Бүх 32 зөв хэрчмийг үүсгэх
vector<Edge> get_all_edges() {
vector<Edge> edges;
for (int x1 = 0; x1 <= 2; ++x1)
for (int y1 = 0; y1 <= 2; ++y1)
for (int x2 = 0; x2 <= 2; ++x2)
for (int y2 = 0; y2 <= 2; ++y2) {
if (make_pair(x1, y1) >= make_pair(x2, y2)) continue;
int dx = abs(x1 - x2), dy = abs(y1 - y2);
if (__gcd(dx, dy) == 1) { // "Зөв" хэрчим
edges.push_back({{x1, y1}, {x2, y2}});
}
}
return edges;
}
// Дүрсийг 64-бит тоо (bitmask) болгож хөрвүүлэх замаар n-ийг илэрхийлэх
// Дэд бодлого 5, 6, 7-д зориулж bitmask ашиглах нь тохиромжтой.
// Гэхдээ 32 бит нь 4 тэрбум боломж тул n-ийг шууд битээр хадгалж болно.
vector<Edge> BuildPattern(int n) {
vector<Edge> all = get_all_edges();
vector<Edge> result;
// n-ийг "эргүүлэлтэд тэсвэртэй" болгохын тулд
// n-ийг тодорхой битүүдэд тарааж байрлуулна.
// Энгийн хувилбар: 26 бит ашиглан (n) дүрсийг бүтээх
for (int i = 0; i < 30; i++) {
if ((n >> i) & 1) {
result.push_back(all[i]);
}
}
// Тусгай тэмдэг: (0,0)-(1,2) гэх мэт эргэхэд давтагдахгүй хэрчмийг
// чиглэл тогтооход ашиглаж болно.
return result;
}
int GetCardNumber(vector<Edge> p) {
vector<Edge> all = get_all_edges();
// Эргүүлэлт бүрийг шалгаж, анхны n-ийг сэргээх логик энд орно.
// ... (Эргүүлэлтийн 4 хувилбарыг туршиж үзээд, зөв n-ийг олох)
return 0; // Жишээ
}