영구 운동 (Small)

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

요약
최대 4 by 4 격자의 각 벨트에 방향을 정해 레밍이 같은 칸에 겹치지 않게 하는 경우의 수를 1000003으로 나눈 나머지를 구합니다.
난이도

쉬움10점 중 3점

유형
완전 탐색, 시뮬레이션
정답자
아직 제출이 없습니다

문제

레밍 공장의 바닥은 R×CR \times C 격자로 나뉘어 있다. 각 칸에는 컨베이어 벨트가 하나씩 놓여 있고, 벨트의 방향은 위아래, 좌우, 두 대각선 중 하나다. 벨트는 자기 방향을 따라 앞으로 또는 뒤로 움직이며, 두 방향 중 어느 쪽으로 움직일지는 칸마다 따로 정할 수 있다.

예시 바닥 배치

지금은 모든 칸의 중앙에 레밍이 한 마리씩 서 있다. 벨트를 작동시키면 각 레밍은 자기가 서 있는 칸의 벨트가 움직이는 방향으로 이동해 새 칸의 중앙에 도착한다. 모든 이동은 동시에 일어나고 정확히 1초가 걸린다. 이동이 끝나면 레밍은 모두 새 칸에 서 있고, 그 위치에서 같은 과정이 반복된다. 벨트를 끄지 않으면 이 과정은 영원히 이어진다.

  • 레밍이 새 칸에 들어서면 그 칸의 중앙에 닿을 때까지 원래 가던 방향으로 계속 간다. 새 칸의 벨트는 다음 1초가 시작될 때부터 레밍에게 영향을 준다.
  • 레밍이 격자 밖으로 나가면 반대쪽 같은 위치로 들어온다. 예를 들어 맨 왼쪽 위 칸에서 왼쪽 위 대각선으로 움직이면 맨 오른쪽 아래 칸에 도착한다. 이 이동도 1초가 걸린다.
  • 레밍끼리는 부딪히지 않고 서로를 지나쳐 갈 수 있다.

풀어야 할 것은 두 레밍이 같은 순간에 같은 칸의 중앙에 도착하는 일이 한 번도 없도록 벨트마다 방향을 정하는 문제다. 그런 일이 일어나면 두 레밍은 그때부터 붙어서 함께 움직인다.

위 예시에서 벨트 방향을 정하는 두 가지 방법은 다음과 같다.

방향을 정하는 두 가지 방법

두 방법 모두 두 레밍이 같은 순간에 같은 칸의 중앙에 도착하는 일이 없다.

바닥 배치가 주어질 때, 두 레밍이 같은 순간에 같은 칸의 중앙에 도착하는 일이 없도록 각 벨트의 방향을 정하는 방법의 수 NN을 구하라. NN이 매우 클 수 있으므로 NN을 10000031000003으로 나눈 나머지를 출력한다.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다. 이어서 TT개의 테스트 케이스가 주어진다. 각 테스트 케이스의 첫 줄에는 양의 정수 RR과 CC가 주어진다.

그 다음 RR개의 줄에는 |, -, /, \ 중에서 고른 문자 CC개로 이루어진 문자열이 주어진다. 각 문자는 한 칸에 놓인 벨트의 방향을 나타낸다.

  • |는 위 또는 아래로 움직이는 벨트다.
  • -는 왼쪽 또는 오른쪽으로 움직이는 벨트다.
  • /는 오른쪽 위 또는 왼쪽 아래로 움직이는 벨트다.
  • \는 왼쪽 위 또는 오른쪽 아래로 움직이는 벨트다.

제한

  • 1≤T≤251 \le T \le 25
  • 3≤R≤43 \le R \le 4
  • 3≤C≤43 \le C \le 4

출력

각 테스트 케이스마다 한 줄에 Case #x: M을 출력한다. x는 1부터 시작하는 테스트 케이스 번호이고, MM은 NN을 10000031000003으로 나눈 나머지다.

예제2

  1. 예제 1

    입력
    3
    3 3
    |-/
    |||
    --|
    3 4
    ----
    ||||
    \\//
    4 4
    |---
    \-\|
    \|||
    |--\
    
    예상 출력
    Case #1: 2
    Case #2: 0
    Case #3: 16
    
  2. 예제 2

    입력
    4
    3 3
    |||
    |||
    |||
    3 3
    ---
    ---
    ---
    4 4
    ////
    ////
    ////
    ////
    3 4
    ////
    ////
    ////
    
    예상 출력
    Case #1: 8
    Case #2: 8
    Case #3: 256
    Case #4: 4