import sys N = 40 def build(m): g = [["#"] * N for _ in range(N)] for r in range(N): for c in range(N): if -2 <= r - c <= 3: g[r][c] = "." switches, exits = [], [] for r in range(N): c = r + 2 if c + 2 < N: switches.append((r, c + 1)); exits.append((r, c + 2)) for c in range(N): r = c + 3 if r + 2 < N: switches.append((r + 1, c)); exits.append((r + 2, c)) for r in range(N): for c in range(N): if r + c >= 2 * N - 7 and g[r][c] == ".": g[r][c] = "#" dp = [[0] * N for _ in range(N)] dp[0][0] = 1 for r in range(N): for c in range(N): if (r or c) and g[r][c] == ".": dp[r][c] = (dp[r - 1][c] if r else 0) + (dp[r][c - 1] if c else 0) values = [(dp[r - 1][c] if r else 0) + (dp[r][c - 1] if c else 0) for r, c in switches] chosen = [] for i in sorted(range(len(values)), key=values.__getitem__, reverse=True): if values[i] <= m: m -= values[i]; chosen.append(i) assert m == 0 upper, lower = [], [] for i in chosen: r, c = switches[i] g[r][c] = "P" er, ec = exits[i] g[er][ec] = "." (upper if er < ec else lower).append((er, ec)) def connect(cells, up): if not cells: return cells.sort(); r, c = cells[0] for nr, nc in cells[1:]: if up: for x in range(c, nc + 1): g[r][x] = "." for y in range(r, nr + 1): g[y][nc] = "." else: for y in range(r, nr + 1): g[y][c] = "." for x in range(c, nc + 1): g[nr][x] = "." r, c = nr, nc if up: for x in range(c, N): g[r][x] = "." for y in range(r, N): g[y][-1] = "." else: for y in range(r, N): g[y][c] = "." for x in range(c, N): g[-1][x] = "." connect(upper, True); connect(lower, False) g[0][0] = g[-1][-1] = "." return g it = iter(map(int, sys.stdin.buffer.read().split())) out = [] for _ in range(next(it)): grid = build(next(it)) out.append(str(N)); out.extend(map("".join, grid)) print("\n".join(out))