수열과 변환

1 이상 m 이하의 값을 갖는 길이 n 수열 중에서, 최솟값을 이용한 변환을 k번 적용한 결과의 최댓값과 최솟값의 차가 주어진 값과 같은 수열의 개수를 센다.

어려움9조합론수학동적 계획법구현아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

크기가 nn인 수열 a1,a2,,ana_1, a_2, \ldots, a_n에 변환 연산을 적용한다. 변환 연산은 두 단계로 이루어진다. 먼저 새 수열 b1,b2,,bnb_1, b_2, \ldots, b_n을 다음 식으로 만든다.

bi=(minj=1naj)ai+j=1naj(1in)b_i = \left(\min_{j=1}^{n} a_j\right) - a_i + \sum_{j=1}^{n} a_j \quad (1 \le i \le n)

그다음 수열 aa를 수열 bb로 바꾼다. 즉 모든 1in1 \le i \le n에 대해 aia_i의 값을 bib_i로 바꾼다.

길이가 nn인 수열 xx에 대해 q(x)=maxi=1nximini=1nxiq(x) = \max_{i=1}^{n} x_i - \min_{i=1}^{n} x_i로 정의한다.

수열 rr은 어떤 수열에 변환 연산을 kk번 적용한 결과이고, q(r)q(r)의 값과 kk를 알고 있다. 이때 다음 두 조건을 모두 만족하는 수열 c1,c2,,cnc_1, c_2, \ldots, c_n의 개수를 구하는 프로그램을 작성하시오.

  1. 모든 1in1 \le i \le n에 대해 1cim1 \le c_i \le m이다.
  2. q(d)=q(r)q(d) = q(r)이다. 여기서 dd는 수열 cc에 변환 연산을 kk번 적용한 수열이다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다 (1T100001 \le T \le 10000).

각 테스트 케이스는 한 줄로 이루어지며, 네 정수 nn, mm, q(r)q(r), kk가 공백으로 구분되어 주어진다 (1n,m,q(r),k1091 \le n, m, q(r), k \le 10^9).

출력

각 테스트 케이스마다 정답을 109+710^9 + 7로 나눈 나머지를 한 줄에 출력한다.