# Throwaway preliminary check (Stage B). Re-implemented properly in Stage C.
def P(n,k):
    adj={}
    def add(a,b):
        adj.setdefault(a,set()).add(b); adj.setdefault(b,set()).add(a)
    for i in range(n):
        add(('u',i),('u',(i+1)%n)); add(('u',i),('v',i)); add(('v',i),('v',(i+k)%n))
    return adj
def closure(adj,S):
    B=set(S); changed=True
    while changed:
        changed=False
        for x in list(B):
            w=[y for y in adj[x] if y not in B]
            if len(w)==1: B.add(w[0]); changed=True
    return B
def forces(adj,S): return len(closure(adj,S))==len(adj)
def u(i,n): return ('u',(i-1)%n)   # 1-indexed in Rashidi
def v(i,n): return ('v',(i-1)%n)
def thm21_set(n,k):
    r,s=divmod(n,k)
    if s==0: return None
    return {u(j+i*k,n) for i in range(r) for j in range(1,s+3)}, r*(s+2)
def thm22_set(n,k): return {u(j,n) for j in range(1,2*k+3)}
def alameda_set(n,k): return {v(j,n) for j in range(1,2*k+1)}|{u(k,n),u(k+1,n)}
for k in (2,3,5):
    print("k=",k)
    for n in range(2*k+1, 41 if k==5 else 25):
        adj=P(n,k)
        t=thm21_set(n,k)
        a=None
        if t:
            A,b=t; a=(len(A),forces(adj,A))
        print(f" n={n:2d} thm2.1:{a}  thm2.2(2k+2):{forces(adj,thm22_set(n,k))}  alameda-type({2*k+2}):{forces(adj,alameda_set(n,k))}")
