물고기

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

요약
물고기의 길이와 보석 종류가 주어질 때, 한 물고기가 가질 수 있는 서로 다른 보석 개수 조합의 수를 M으로 나눈 나머지를 구한다. 물고기는 자기보다 두 배 이상 긴 경우에만 다른 물고기를 먹을 수 있다.
난이도

어려움10점 중 8점

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

문제

사막 한가운데 멀리 호수가 하나 있다. 이 호수에는 원래 물고기 FF마리가 살고 있었다. 지구에서 가장 값진 보석 중 서로 다른 KK종류가 선택되었고, FF마리의 각 물고기는 정확히 한 개의 보석을 삼켰다. KK가 FF보다 작을 수 있으므로, 여러 물고기가 같은 종류의 보석을 삼켰을 수도 있다.

시간이 흐르면서 일부 물고기는 다른 물고기를 잡아먹었다. 물고기 AA는 자신의 길이가 물고기 BB의 두 배 이상일 때, 즉 LA≥2⋅LBL_A \ge 2 \cdot L_B일 때에만 BB를 잡아먹을 수 있다. 언제 잡아먹을지에 대한 규칙은 없다. 한 물고기가 더 작은 물고기 여러 마리를 잇달아 잡아먹을 수도 있고, 잡아먹을 수 있더라도 한 마리도 먹지 않을 수도 있다. 물고기가 더 작은 물고기를 먹어도 자신의 길이는 변하지 않으며, 먹힌 물고기의 뱃속에 있던 보석은 모두 손상 없이 잡아먹은 물고기의 뱃속으로 옮겨진다.

당신은 호수에서 물고기 한 마리를 꺼내어 그 뱃속에 들어 있는 보석을 모두 가질 수 있다. 길을 나서기 전에, 물고기 한 마리를 잡아서 얻을 수 있는 서로 다른 보석 조합이 몇 가지인지 알고 싶다.

각 물고기의 길이와 처음에 삼킨 보석의 종류가 주어졌을 때, 어떤 물고기의 뱃속에 최종적으로 들어 있을 수 있는 서로 다른 보석 조합의 수를 주어진 정수 MM으로 나눈 나머지를 구하는 프로그램을 작성하라. 하나의 조합은 오직 KK종류의 보석을 각각 몇 개씩 포함하는지에 의해서만 결정된다. 보석 사이에 순서는 없으며, 같은 종류의 보석 두 개는 서로 구별되지 않는다.

입력

  • 첫째 줄에 호수에 원래 있던 물고기의 수 FF가 주어진다 (1≤F≤500,0001 \le F \le 500{,}000).
  • 둘째 줄에 보석의 종류 수 KK가 주어진다. 보석의 종류는 11부터 KK까지의 번호로 나타낸다 (1≤K≤F1 \le K \le F).
  • 셋째 줄에 정수 MM이 주어진다 (2≤M≤30,0002 \le M \le 30{,}000).
  • 다음 FF개의 각 줄에는 한 물고기를 나타내는 두 정수가 공백으로 구분되어 주어진다. 각각 물고기의 길이와 그 물고기가 처음에 삼킨 보석의 종류이다 (1≤LX≤1,000,000,0001 \le L_X \le 1{,}000{,}000{,}000).

KK종류의 보석이 각각 적어도 하나씩은 존재함이 보장된다.

출력

00 이상 M−1M-1 이하의 정수 하나를 한 줄에 출력한다. 이는 가능한 서로 다른 보석 조합의 수를 MM으로 나눈 나머지이다. MM은 계산 결과를 작게 유지하는 것 외에 다른 의미는 없다.

예제3

  1. 예제 1

    입력
    5
    3
    7
    2 2
    5 1
    8 3
    4 1
    2 3
    
    예상 출력
    4
    
  2. 예제 2

    입력
    1
    1
    2
    5 1
    
    예상 출력
    1
    
  3. 예제 3

    입력
    3
    1
    1000
    1 1
    2 1
    4 1
    
    예상 출력
    3