def sieve(N):
n = int(N**0.5)
p = list(range(n+1))
for j in range(2,n+1):
if p[j]:
for k in range(j**2,n+1,j):
p[k]=False
P = [l for l in p[2:] if l]
m = 1
while (m+1)*n < N:
u = (m+1)*n+1
p = list(range(m*n+1,u))
for x in P:
v = x*((m*n)//x+1)
if v > u:
break
for y in range(v,u,x):
p[y-m*n-1]=False
for j in range(len(p)):
if p[j]:
if p[j] > n**0.5+m*n+1:
break
for k in range(p[j]**2,p[-1]+1,p[j]):
p[k]=False
P+=[l for l in p if l]
m+=1
p = list(range(m*n+1,N+1))
for x in P:
v = x*((m*n)//x+1)
if v > N and v/(x)*(x-1) > m*n+1:
v = v//x*(x-1)
for y in range(v,N+1,x):
p[y-m*n-1]=False
for j in range(len(p)):
if p[j]:
if p[j] > n**0.5+m*n+1:
break
for k in range(p[j]**2,p[-1]+1,p[j]):
p[k]=False
P+=[l for l in p if l]
return P
ZGVmIHNpZXZlKE4pOgogICAgbiA9IGludChOKiowLjUpCiAgICBwID0gbGlzdChyYW5nZShuKzEpKQogICAgZm9yIGogaW4gcmFuZ2UoMixuKzEpOgogICAgICAgIGlmIHBbal06CiAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKGoqKjIsbisxLGopOgogICAgICAgICAgICAgICAgICAgIHBba109RmFsc2UKICAgIFAgPSBbbCBmb3IgbCBpbiBwWzI6XSBpZiBsXQogICAgbSA9IDEKICAgIHdoaWxlIChtKzEpKm4gPCBOOgogICAgICAgIHUgPSAobSsxKSpuKzEKICAgICAgICBwID0gbGlzdChyYW5nZShtKm4rMSx1KSkKICAgICAgICBmb3IgeCBpbiBQOgogICAgICAgICAgICB2ID0geCooKG0qbikvL3grMSkKICAgICAgICAgICAgaWYgdiA+IHU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBmb3IgeSBpbiByYW5nZSh2LHUseCk6CiAgICAgICAgICAgICAgICBwW3ktbSpuLTFdPUZhbHNlCiAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHApKToKICAgICAgICAgICAgaWYgcFtqXToKICAgICAgICAgICAgICAgIGlmIHBbal0gPiBuKiowLjUrbSpuKzE6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKHBbal0qKjIscFstMV0rMSxwW2pdKToKICAgICAgICAgICAgICAgICAgICBwW2tdPUZhbHNlCiAgICAgICAgUCs9W2wgZm9yIGwgaW4gcCBpZiBsXQogICAgICAgIG0rPTEKICAgIHAgPSBsaXN0KHJhbmdlKG0qbisxLE4rMSkpCiAgICBmb3IgeCBpbiBQOgogICAgICAgIHYgPSB4KigobSpuKS8veCsxKQogICAgICAgIGlmIHYgPiBOIGFuZCB2Lyh4KSooeC0xKSA+IG0qbisxOgogICAgICAgICAgICB2ID0gdi8veCooeC0xKQogICAgICAgIGZvciB5IGluIHJhbmdlKHYsTisxLHgpOgogICAgICAgICAgICBwW3ktbSpuLTFdPUZhbHNlCiAgICBmb3IgaiBpbiByYW5nZShsZW4ocCkpOiAKICAgICAgICAgICAgaWYgcFtqXToKICAgICAgICAgICAgICAgIGlmIHBbal0gPiBuKiowLjUrbSpuKzE6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKHBbal0qKjIscFstMV0rMSxwW2pdKToKICAgICAgICAgICAgICAgICAgICBwW2tdPUZhbHNlCiAgICBQKz1bbCBmb3IgbCBpbiBwIGlmIGxdCiAgICByZXR1cm4gUA==