만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

과자 줍기

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

요약
R×C 격자에 놓인 간식 N개가 주어질 때, 왼쪽 위에서 오른쪽 아래까지 오른쪽이나 아래로만 움직여 간식을 가장 많이 줍는 경로의 수를 1000003으로 나눈 나머지로 구합니다.
난이도

보통10점 중 7점

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

문제

Albert와 Bob은 "과자 줍기" 보드 게임을 즐겨 한다.

이 게임은 크기가 R×CR \times C인 격자 보드에서 진행한다. 먼저 Bob이 NN개의 칸을 골라 과자를 하나씩 올려 둔다. 각 칸에는 과자를 최대 1개만 올릴 수 있으며, 좌측 상단 (1,1)(1, 1)과 우측 하단 (R,C)(R, C)에는 과자를 올릴 수 없다. 이후 Albert는 게임 말을 (1,1)(1, 1) 칸에 올린 뒤 오른쪽 또는 아래로만 이동하여 (R,C)(R, C) 칸에 도달해야 하며, 이동한 경로를 따라 최대한 많은 과자를 줍는다.

예를 들어 아래 그림은 R=3R = 3, C=5C = 5, N=3N = 3인 경우를 나타낸다. 편의상 과자의 위치는 크기가 NN인 두 배열 XX, YY로 행과 열을 나타내며, 이 그림의 경우 X=[1,1,2]X = [1, 1, 2], Y=[3,4,3]Y = [3, 4, 3]이 된다.

S로 표시된 (1,1)(1, 1)에서 출발해 E로 표시된 (3,5)(3, 5) 칸으로 가는 방법은 여럿 있다. 아래 그림처럼 (1,1)→(2,1)→(2,2)→(2,3)→(2,4)→(3,4)→(3,5)(1, 1) \rightarrow (2, 1) \rightarrow (2, 2) \rightarrow (2, 3) \rightarrow (2, 4) \rightarrow (3, 4) \rightarrow (3, 5) 순으로 이동하면 과자를 1개만 줍는다.

하지만 아래 그림처럼 여섯 가지 방법으로는 과자를 총 2개 주울 수 있다.

이 그림의 경우 과자를 3개 주우면서 S칸에서 E칸으로 도달하는 방법은 없다.

Albert는 입력으로 주어진 보드에서 최대한 많은 과자를 줍는 서로 다른 방법이 몇 가지인지 궁금해졌다. Albert를 도와 이 값을 구해 보자. 위 경우의 정답은 6이다.

입력

입력 첫 줄에 테스트 케이스의 수 TT가 주어진다. 각 테스트 케이스의 첫 줄에는 RR, CC, NN 값이 공백으로 구분되어 주어진다. 다음 NN개의 줄에는 각 줄마다 ii번째 과자가 놓인 칸의 행 위치 XiX_i와 열 위치 YiY_i가 공백으로 구분되어 주어진다.

출력

각 테스트 케이스에서 시작 칸 (1,1)(1, 1)부터 도착 칸 (R,C)(R, C)까지 이동하며 최대한 많은 과자를 줍는 방법의 수를 한 줄에 출력한다. 이 수는 매우 클 수 있으므로 1000003으로 나눈 나머지를 출력한다.

제한

  • 1≤T≤201 \le T \le 20
  • 1≤R,C≤1061 \le R, C \le 10^6
  • 1≤N≤1001 \le N \le 100
  • 1≤i≤N1 \le i \le N인 ii에 대하여:
    • 1≤Xi≤R1 \le X_i \le R
    • 1≤Yi≤C1 \le Y_i \le C
    • (Xi,Yi)≠(1,1)(X_i, Y_i) \ne (1, 1)
    • (Xi,Yi)≠(R,C)(X_i, Y_i) \ne (R, C)
  • 1≤i,j≤N1 \le i, j \le N이고 i≠ji \ne j인 모든 쌍에 대하여: (Xi,Yi)≠(Xj,Yj)(X_i, Y_i) \ne (X_j, Y_j)

예제1

  1. 예제 1

    입력
    4
    3 5 3
    1 3
    1 4
    2 3
    3 5 2
    2 2
    3 3
    4 4 1
    1 4
    4 4 2
    4 1
    2 4
    
    예상 출력
    6
    4
    1
    5