#include <bits/stdc++.h> #define sc(x) scanf("%lld", &(x)) #define pr(x) printf("%lld\n", x) using namespace std; typedef long long ll; const int N = 10 + 7; const ll mod = 1e9 + 7; int ht[N]; int fa[N]; int n = 8; // point numers void init() { for (int i = 1; i <= n; ++i) fa[i] = i, ht[i] = 0; } int Find(int x) { if (x != fa[x]) fa[x] = Find(fa[x]); //路径压缩 return fa[x]; } int findC(int x) { int r = x; while (fa[r] != r) r = fa[r]; //找到根节点 for (int i = x, j; i != r; i = j) j = fa[i], fa[i] = r; //把路径上的元素的集改为根节点 return r; } int a[8] = {0}; void merge(int x, int y) { if (!a[x] || !a[y]) return; x = Find(x); y = Find(y); if (ht[x] == ht[y]) ht[x] = ht[x] + 1, fa[y] = x; else if (ht[x] < ht[y]) fa[x] = y; else fa[y] = x; } bool chk() { int cnt = 0; for (int i = 1; i <= 7; ++i) if (a[i] && i == Find(i)) ++cnt; return cnt == 1; } int main() { int cnt = 0; for (int i = 1; i < (1 << 7); ++i) { memset(a, 0, sizeof(a)); for (int j = 1, n = i; j <= 7; ++j) a[j] = n & 1, n >>= 1; init(); merge(1, 2); merge(2, 3); merge(1, 7); merge(3, 7); merge(3, 4); merge(3, 6); merge(4, 5); merge(5, 6); merge(2, 4); merge(6, 7); cnt += chk(); } cout << cnt << endl; return 0; }