거대한 탑

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

요약
블록 N개를 쌓을 때 위 블록이 아래 블록보다 D 초과로 크지 않아야 한다는 조건을 만족하는 탑의 개수를 1e9+9로 나눈 나머지로 구합니다.
난이도

보통10점 중 6점

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

문제

고대 바빌로니아 사람들이 거대한 탑을 쌓기로 했다. 이 탑은 정육면체 모양의 블록 NN개를 하나씩 위로 쌓아 만든다. 그들은 나라 곳곳에서 다양한 크기의 블록을 많이 모았다. 예전에 실패했던 경험을 통해, 훨씬 작은 블록 위에 큰 블록을 바로 올리면 탑이 무너진다는 사실을 알게 되었다.

두 블록은 크기가 같더라도 서로 다른 것으로 본다. 각 블록의 한 변의 길이가 주어진다. 또한 정수 DD가 주어지는데, 블록 AA의 변의 길이가 블록 BB의 변의 길이에 DD를 더한 값보다 크면(엄밀히 큰 경우) 블록 AA를 블록 BB의 바로 위에 올릴 수 없다.

모든 블록을 사용하여 탑을 쌓는 서로 다른 방법의 수를 구하여라. 이 수가 매우 커질 수 있으므로, 109+910^9 + 9로 나눈 나머지를 출력한다.

입력

첫째 줄에 두 양의 정수 NN과 DD가 주어진다. 각각 블록의 개수와 허용 오차를 의미한다.

둘째 줄에는 공백으로 구분된 NN개의 정수가 주어지며, 각 블록의 한 변의 길이를 나타낸다.

출력

쌓을 수 있는 탑의 개수를 109+910^9 + 9로 나눈 나머지를 한 줄에 정수 하나로 출력한다.

제한

입력에 주어지는 모든 수는 10910^9 이하의 양의 정수이다. NN은 항상 22 이상이다.

예제2

  1. 예제 1

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

    입력
    6 9
    10 20 20 10 10 20
    
    예상 출력
    36