만드는 중입니다

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

힙

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

요약
주어진 d-ary 힙 순열이 크기 n의 모든 d-ary 힙 순열 중 사전순으로 몇 번째인지 10^9+7로 나눈 나머지를 구합니다.
난이도

보통10점 중 7점

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

문제

크기가 nn인 dd-ary 힙은 배열 a1,a2,…,ana_1, a_2, \ldots, a_n이며, 1≤i≤n1 \le i \le n, 1≤j≤n1 \le j \le n, (i−1)⋅d+2≤j≤i⋅d+1(i - 1) \cdot d + 2 \le j \le i \cdot d + 1을 만족하는 모든 인덱스 쌍 (i,j)(i, j)에 대해 aj>aia_j > a_i가 엄격하게 성립한다. 예를 들어 d=3d = 3이고 크기가 88인 3진 힙에서는 a2>a1a_2 > a_1, a3>a1a_3 > a_1, a4>a1a_4 > a_1, a5>a2a_5 > a_2, a6>a2a_6 > a_2, a7>a2a_7 > a_2, a8>a3a_8 > a_3이 성립해야 한다. 크기가 nn인 dd-ary 힙 중 11부터 nn까지의 수를 원소로 하는 순열인 것을 모두 고른다. 이들을 수열로 보고 사전식 순서로 나열한 뒤 11번부터 번호를 매긴다. 주어지는 것은 크기가 nn인 dd-ary 힙이면서 순열이기도 한 배열이다. 이 배열이 위 목록에서 몇 번째인지 구하라. 답이 매우 클 수 있으므로 (109+7)(10^9 + 7)로 나눈 나머지를 구한다.

입력

첫 줄에 테스트 케이스의 개수 TT가 양의 정수로 주어진다. 각 테스트 케이스는 두 줄로 주어진다. 첫 줄에는 두 정수 nn과 dd (1≤n≤30001 \le n \le 3000, 1≤d≤30001 \le d \le 3000)가 주어진다. 둘째 줄에는 순열을 나타내는 nn개의 정수가 주어진다. 이 줄에는 11부터 nn까지의 각 정수가 정확히 한 번씩 나타난다. 주어진 순열은 dd-ary 힙이기도 하다. 모든 테스트 케이스의 nn을 합하면 30003000을 넘지 않는다.

출력

각 테스트 케이스마다, 주어진 수열이 dd-ary 힙이면서 순열인 수열들의 사전식 목록에서 몇 번째인지를 11부터 세어 출력한다. 답은 (109+7)(10^9 + 7)로 나눈 나머지로 출력한다.

예제1

  1. 예제 1

    입력
    2
    5 2
    1 3 2 4 5
    5 3
    1 4 3 2 5
    
    예상 출력
    7
    12