아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

JOI 깃발

시간 제한5초메모리 제한128 MB

요약
일부 칸이 J, O, I로 고정된 M×N 격자에서 어떤 J의 오른쪽이 O이고 아래가 I인 L 모양이 하나 이상 나타나는 채우기 가짓수를 100000으로 나눈 나머지로 구한다.
난이도

보통10점 중 5점

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

문제

어떤 위원회가 JOI 로고를 본떠 깃발을 디자인했다. 깃발은 M×NM \times N 격자이며, 각 칸에는 세 문자 J, O, I 중 하나가 정확히 하나씩 들어간다.

다음과 같은 L자 모양이 깃발 안에 적어도 한 번 나타나면 그 깃발을 좋은 깃발이라고 부른다. 어떤 칸이 J이고, 그 칸의 바로 오른쪽 칸이 O이며, J가 있는 칸의 바로 아래 칸이 I인 경우이다.

J O
I .

(. 칸에는 어떤 문자가 와도 상관없고, 표시된 세 칸만 중요하다.) 형식적으로, 1≤i≤M−11 \le i \le M-1, 1≤j≤N−11 \le j \le N-1인 행 ii와 열 jj가 존재하여 ii행 jj열이 J, ii행 j+1j+1열이 O, i+1i+1행 jj열이 I이면 좋은 깃발이다.

일부 칸은 이미 특정 문자로 정해져 있다. 나머지 칸은 아직 정해지지 않았으며 J, O, I 중 어느 것이든 될 수 있다. MM, NN과 정해진 칸들이 주어졌을 때, 아직 정해지지 않은 칸들을 채워 좋은 깃발을 만드는 방법의 수를 구하여라. 그 수를 100000100000으로 나눈 나머지를 출력한다.

입력

첫째 줄에 깃발의 행 수와 열 수를 나타내는 두 정수 MM과 NN이 주어진다 (2≤M,N≤202 \le M, N \le 20).

다음 MM개의 줄에는 각각 깃발의 한 행을 나타내는 NN개의 문자가 주어진다. 각 문자는 J, O, I, ? 중 하나이다. 문자인 경우 그 칸이 이미 해당 문자로 정해져 있다는 뜻이고, ?는 아직 정해지지 않았다는 뜻이다.

출력

좋은 깃발을 만드는 방법의 수를 100000100000으로 나눈 나머지를 한 줄에 출력한다.

힌트

L자 모양에서 제약을 받는 칸은 세 칸뿐이며, J의 대각선 방향(2×22 \times 2 블록의 오른쪽 아래) 칸에는 어떤 문자가 와도 된다. 깃발 어딘가에 이 배치가 한 번만 나타나도 좋은 깃발이 되므로, 좋은 깃발이 아닌 경우의 수를 세어 전체 경우의 수에서 빼는 방식이 더 쉬울 때가 많다.

예제4

  1. 예제 1

    입력
    2 3
    ??O
    IIJ
    
    예상 출력
    4
    
  2. 예제 2

    입력
    2 2
    ??
    ??
    
    예상 출력
    3
    
  3. 예제 3

    입력
    3 3
    ??I
    ???
    O?J
    
    예상 출력
    53
    
  4. 예제 4

    입력
    5 4
    JOI?
    ????
    ????
    ????
    ?JOI
    
    예상 출력
    28218