만드는 중입니다

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

창호의 유학 준비

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

요약
길이가 N인 학습 순서를 X개 단어로 만드는 경우의 수를 구합니다. Y개의 기억하는 단어는 Z번 이상 연속으로 나오지 않습니다. 답은 1,000,000,007로 나눈 나머지로 출력합니다.
난이도

보통10점 중 7점

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

문제

창호는 외국으로 유학을 준비하면서 요즘 외국어 공부에 매진하고 있다. 재우는 창호를 돕고자 서로 다른 외국어 단어 XX개가 적힌 리스트를 선물했다. 그런데 이 리스트의 단어 중 YY개는 창호가 이미 아는 단어였다. 창호는 이런 단어를 Well-Known 단어라고 부르기로 했다. 창호는 효율적으로 공부하려고 Well-Known 단어에 대해서는 같은 단어를 ZZ번 이상 연속으로 공부하지 않기로 규칙을 정했다. 재우는 이 규칙을 듣고, 창호가 리스트의 단어를 공부하는 전체 경우의 수가 궁금해졌다.

공부 한 번에는 단 하나의 단어만 공부한다고 하자. 창호가 외국어 공부를 하는 횟수 NN, 리스트에 포함된 단어의 개수 XX, Well-Known 단어의 개수 YY, Well-Known 단어 공부에 대한 제한 ZZ가 주어질 때, 창호가 리스트의 단어를 공부하는 전체 경우의 수를 구하라. 같은 단어를 여러 번 공부할 수도 있고, 공부하지 않는 단어가 있을 수도 있다.

입력

첫 번째 줄에 네 정수 NN (1≤N≤10181 \leq N \leq 10^{18}), XX (1≤X≤10181 \leq X \leq 10^{18}), YY (1≤Y≤X1 \leq Y \leq X), ZZ (1≤Z≤1031 \leq Z \leq 10^{3})가 공백을 사이에 두고 주어진다.

출력

창호가 리스트의 단어를 공부하는 전체 경우의 수를 1 000 000 0071\,000\,000\,007로 나눈 나머지를 출력한다. 답이 커질 수 있기 때문이다.

예제3

  1. 예제 1

    입력
    2 3 2 2
    
    예상 출력
    7
    
  2. 예제 2

    입력
    10 3 2 3
    
    예상 출력
    36559
    
  3. 예제 3

    입력
    16 5 2 4
    
    예상 출력
    455819708