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

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

카르테시안 트리

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

요약
1부터 N까지의 순열이 만드는 카르테시안 트리 중 두 자식을 가진 노드의 자식 위치 차이 합이 S 이하인 순열의 개수를 소수로 나눈 나머지를 구한다.
난이도

어려움10점 중 8점

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

문제

서로 다른 정수로 이루어진 수열 AA 하나에서 카르테시안 트리가 유일하게 정해진다. 카르테시안 트리는 다음 네 조건을 만족하는 트리이다.

  1. 루트가 있는 이진 트리이다.
  2. 각 노드는 AA의 원소 하나에 대응한다.
  3. 트리를 인오더로 순회하면 AA와 순서가 같다.
  4. 부모 노드의 값이 자식 노드의 값보다 작다. 즉 최소 힙이다.

아래 그림은 A=[9,3,7,1,8,12,10,20,15,18,5]A = [9, 3, 7, 1, 8, 12, 10, 20, 15, 18, 5]로 만든 카르테시안 트리이다.

카르테시안 트리 예시

수열 AA로 만든 카르테시안 트리를 TT라고 하자. TT의 점수는 이렇게 구한다. 자식이 두 개인 노드마다 두 자식의 값이 AA에서 놓인 위치를 찾고, 두 위치의 차이를 구한다. 이 차이를 그런 노드 전체에서 더한 값이 TT의 점수이다.

위 그림에서 자식이 두 개인 노드는 1, 3, 10, 15이다. 노드 1의 두 자식은 3과 5이고 AA에서 각각 2번째와 11번째에 있으므로 이 노드의 점수는 11−2=911 - 2 = 9이다. 나머지 세 노드의 점수는 각각 2, 3, 2이므로 TT의 점수는 9+2+3+2=169 + 2 + 3 + 2 = 16이다.

NN, SS, MOD\text{MOD}가 주어진다. 11부터 NN까지의 수로 이루어진 순열은 모두 N!N!개이고, 각 순열은 카르테시안 트리를 하나씩 만든다. 점수가 SS 이하인 트리의 개수를 XX라고 할 때, XX를 MOD\text{MOD}로 나눈 나머지를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 NN, SS, MOD\text{MOD}가 공백으로 구분되어 주어진다. (1≤N≤1001 \le N \le 100, 0≤S≤1000 \le S \le 100, 3≤MOD≤1093 \le \text{MOD} \le 10^9, MOD\text{MOD}는 소수)

출력

첫째 줄에 N!N!개의 순열 중에서 트리의 점수가 SS 이하인 것의 개수를 MOD\text{MOD}로 나눈 나머지를 출력한다.

힌트

N=3N = 3일 때 순열 (2,1,3)(2, 1, 3)과 (3,1,2)(3, 1, 2)의 점수는 2이고, 나머지 네 순열의 점수는 0이다.

예제6

  1. 예제 1

    입력
    3 1 71876209
    
    예상 출력
    4
    
  2. 예제 2

    입력
    4 0 1000003
    
    예상 출력
    8
    
  3. 예제 3

    입력
    4 1 483128897
    
    예상 출력
    8
    
  4. 예제 4

    입력
    5 3 907283243
    
    예상 출력
    82
    
  5. 예제 5

    입력
    5 100 101
    
    예상 출력
    19
    
  6. 예제 6

    입력
    20 30 3
    
    예상 출력
    2