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

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

이중 정렬 격자

시간 제한40초메모리 제한512 MB

요약
일부만 채워진 격자를 각 행과 각 열이 비감소하도록 채우는 경우의 수를 10007로 나눈 나머지로 구한다. R과 C는 10 이하다.
난이도

보통10점 중 7점

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

문제

각 칸에 영어 소문자가 하나씩 적힌 직사각형 격자가 있다. 모든 행에서 글자가 왼쪽에서 오른쪽으로 감소하지 않고, 모든 열에서 글자가 위에서 아래로 감소하지 않으면 이 격자를 이중 정렬 격자라고 부른다. 아래 네 격자 중 앞의 두 개는 이중 정렬 격자이고, 나머지 두 개는 아니다.

abc    ace    aceg    base
def    ade    cdef    base
ghi    bdg    xxyy    base

일부 칸만 채워진 격자가 주어진다. 비어 있는 칸을 모두 채워서 이중 정렬 격자를 만드는 방법이 몇 가지인지 세어라. 답이 매우 커질 수 있으므로 1000710007로 나눈 나머지를 출력한다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 이어서 TT개의 테스트 케이스가 주어진다. 각 테스트 케이스의 첫째 줄에는 행의 수 RR과 열의 수 CC가 공백으로 구분되어 주어진다. 다음 RR개의 줄에는 길이가 CC인 문자열이 한 줄씩 주어지며, 이것이 일부만 채워진 격자다. 격자의 각 문자는 영어 소문자이거나, 아직 채우지 않은 칸을 뜻하는 '.'이다.

제한

  • 1≤T≤401 \le T \le 40
  • 1≤R,C≤101 \le R, C \le 10
  • 격자의 각 문자는 '.' 또는 영어 소문자다.

출력

각 테스트 케이스마다 한 줄을 출력한다. 그 줄에는 "Case #X: y"를 출력하며, XX는 1부터 시작하는 테스트 케이스 번호이고 yy는 만들 수 있는 이중 정렬 격자의 개수를 1000710007로 나눈 나머지다.

예제2

  1. 예제 1

    입력
    3
    2 2
    ad
    c.
    3 3
    .a.
    a.z
    .z.
    4 4
    ....
    .g..
    .cj.
    ....
    
    예상 출력
    Case #1: 23
    Case #2: 7569
    Case #3: 0
    
  2. 예제 2

    입력
    4
    1 1
    .
    1 1
    q
    1 2
    ..
    2 1
    .
    .
    
    예상 출력
    Case #1: 26
    Case #2: 1
    Case #3: 351
    Case #4: 351