데이터를 추가해 주세요.

시간 제한1초메모리 제한1024 MB

요약
모듈로 M이 주어질 때, 유효한 경로 수가 M의 양의 배수가 되는 미로를 만들어, 0을 -1로 출력하는 잘못된 풀이를 반박하는 데이터를 구성한다.
난이도

보통10점 중 5점

유형
동적 계획법, 수학, 조합론, 구현
정답자
아직 제출이 없습니다

문제

현빈이는 다이나믹 프로그래밍의 고수가 되고 싶어서 매일매일 백준에서 다이나믹 프로그래밍 문제를 푼다. 오늘도 어김없이 다이나믹 프로그래밍 문제를 찾던 현빈이는 다음과 같은 문제를 발견했다.

N×NN \times N크기의 미로가 있다. 미로의 가장 왼쪽 위는 (1,1)(1, 1)칸이고 가장 오른쪽 아래는 (N,N)(N, N)칸이며 각 칸은 빈칸 또는 벽으로 구성된다. 시작점인 (1,1)(1, 1)칸에서 출발해 도착점인 (N,N)(N, N)칸에 도달하려 하는데 다음과 같은 규칙에 따라 이동하려 한다.

  1. 현재 위치가 (r,c)(r, c)칸 일 때, (r,c+1)(r, c+1)이 빈칸이라면, (r,c+1)(r, c+1)칸으로 이동할 수 있다.
  2. 현재 위치가 (r,c)(r, c)칸 일 때, (r+1,c)(r+1, c)이 빈칸이라면, (r+1,c)(r+1, c)칸으로 이동할 수 있다.
  3. 현재 위치가 (r,c)(r, c)칸 일 때, (r+1,c)(r+1, c)칸과 (r+2,c)(r+2, c)칸이 빈칸이라면, (r+2,c)(r+2, c)칸으로 한 번에 이동할 수 있다.

미로의 시작점과 도착점은 항상 빈칸임이 보장될 때 시작점에서 출발해 도착점에 도달하는 이동 방법의 개수를 MM으로 나눈 나머지를 출력한다. 단, 시작점에서 출발해 도착점에 도달할 수 없다면 −1-1을 출력한다.

문제를 보자마자 너무 간단한 다이나믹 프로그래밍 문제라고 생각한 현빈이는 신나서 1분 만에 코드를 작성했다. 현빈이가 작성한 코드의 의사코드는 다음과 같다.

function solve(N, M, Map):
    DP = [N + 1][N + 1] # 0으로 초기화된 (N + 1) x (N + 1) 크기의 DP 배열 선언
    DP[1][1] = 1 % M # 시작점 설정

    # '.'은 빈칸 '#'은 벽
    for r from 1 to N:
        for c from 1 to N:
            if Map[r][c] is '#':
                continue

            if r + 1 <= N and Map[r + 1][c] is '.':
                DP[r + 1][c] = (DP[r + 1][c] + DP[r][c]) % M # 이동 방법 1

            if c + 1 <= N and Map[r][c + 1] is '.':
                DP[r][c + 1] = (DP[r][c + 1] + DP[r][c]) % M # 이동 방법 2

            if r + 2 <= N and (Map[r + 1][c] and Map[r + 2][c]) is '.':
                DP[r + 2][c] = (DP[r + 2][c] + DP[r][c]) % M # 이동 방법 3

    if DP[N][N] is 0:
        DP[N][N] = -1

    return DP[N][N]

현빈이는 위와 같은 코드를 제출하고 맞았습니다!! 를 받았지만, 이를 옆에서 지켜보던 민우는 도착점에 도달할 수 있으며 이동 방법의 개수가 MM의 배수라면 00을 출력해야 하는데 현빈이의 코드는 −1-1을 출력한다며 틀린 코드라고 지적했다. 현빈이의 코드를 틀리게 하는 데이터를 추가해 보자.

입력

첫 번째 줄에 양의 정수 MM이 주어진다. (1≤M≤314,159,2651 \le M \le 314\\,159\\,265)

출력

첫 번째 줄에 미로의 크기를 나타내는 정수 NN을 출력한다. (2≤N≤602 \leq N \leq 60)

다음 NN개의 줄에 걸쳐 .과 #로만 이루어진 미로를 나타내는 문자열을 출력한다. ii 번째 줄의 jj 번째 문자는 (i,j)(i, j)칸의 상태를 나타내며, .이라면 빈칸을, #이라면 벽을 의미하고, 시작점과 도착점은 항상 빈칸이어야 한다.

예제2

  1. 예제 1

    입력
    1
    
    예상 출력
    2
    ..
    #.
    
  2. 예제 2

    입력
    2
    
    예상 출력
    3
    .##
    .##
    ...