import sys N = 40 WIDTH = 4 def put(a, r, c): if 0 <= r < N and 0 <= c < N: a[r][c] = "." def connect(a, cells, upper): if not cells: return cells.sort() r, c = cells[0] for nr, nc in cells[1:]: if upper: for x in range(c, nc + 1): put(a, r, x) for y in range(r, nr + 1): put(a, y, nc) else: for y in range(r, nr + 1): put(a, y, c) for x in range(c, nc + 1): put(a, nr, x) r, c = nr, nc if upper: for x in range(c, N): put(a, r, x) for y in range(r, N): put(a, y, N - 1) else: for y in range(r, N): put(a, y, c) for x in range(c, N): put(a, N - 1, x) def build(m): a = [["#"] * N for _ in range(N)] low, high = -(WIDTH // 2 - 1), WIDTH // 2 for r in range(N): for c in range(N): if low <= r - c <= high: a[r][c] = "." switches, exits = [], [] for r in range(N): c = r - low if c + 2 < N: switches.append((r, c + 1)) exits.append((r, c + 2)) for c in range(N): r = c + high 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 a[r][c] == ".": a[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 a[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=lambda i: values[i], reverse=True): if 0 < values[i] <= m: m -= values[i] chosen.append(i) if m: return None upper, lower = [], [] for i in chosen: r, c = switches[i] a[r][c] = "P" put(a, *exits[i]) (upper if exits[i][0] < exits[i][1] else lower).append(exits[i]) connect(a, upper, True) connect(a, lower, False) a[0][0] = a[-1][-1] = "." return a data = list(map(int, sys.stdin.buffer.read().split())) answer = [] for m in data[1:]: grid = build(m) answer += ["-1"] if grid is None else [str(N)] + ["".join(row) for row in grid] print("\n".join(answer))