def multiPermus(els): N = sum(els[k] for k in els) keys = els.keys() ret = [] def rec(soFar): if len(soFar)==N: ret.append(tuple(soFar)) return for k in keys: if els[k]>0: els[k] -= 1 rec(soFar+[k]) els[k] += 1 rec([]) return ret def countBrute(n, m): ret = set() b = [] N = m*n for j in range(1, m+1): b += [j]*n for t in multiPermus({k: n for k in range(1, m+1)}): add = True for j in range(N): if t[j:]+t[:j] in ret: #or (t[j:]+t[:j])[::-1] in ret: #uncomment if can also flip #print ("Found equivalent ", t, t[j:]+t[:j]) add=False break if add: ret.add(t) return len(ret) print ([countBrute(n, 3) for n in range(1, 5)])