증가하는 제한 속도

작은 점화식으로 생성된 수열에서 위치를 기준으로 서로 다른 순증가 부분수열의 개수를 1000000007로 나눈 나머지를 구한다.

보통6동적 계획법정렬조합론누적 합아직 제출이 없습니다시간 제한5초메모리 제한512 MB

문제

고속도로를 달리다가 과속으로 경찰에 잡혔다. 경찰은 한동안 뒤를 따라오고 있었고, 브레이크를 한 번도 밟지 않고 계속 가속만 했다는 사실에 놀랐다. 이제 그럴듯한 변명이 필요하다.

"내가 본 제한 속도 표지판은 모두 커지는 순서였다. 그래서 계속 가속했다"라고 말하기로 했다. 경찰은 웃으면서 그 구간에 세워진 표지판을 순서대로 전부 알려주고, 그중에서 커지는 순서로 놓인 것만 보게 될 만큼 운이 좋았을 리는 없다고 한다.

그 운이 어느 정도인지 가늠해 보자. 주어진 수열에서 엄격하게 증가하는 부분수열이 몇 개인지 세면 된다. 빈 부분수열은 세지 않는다. 표지판을 하나도 보지 않았다는 뜻이 되기 때문이다.

부분수열은 값이 아니라 위치로 구분한다. 예를 들어 수열 (1,4,2,3,5,5)(1, 4, 2, 3, 5, 5)에서 값이 (1,2,5)(1, 2, 5)인 엄격하게 증가하는 부분수열은 55를 고르는 방법이 두 가지이므로 두 번 센다.

입력

첫 줄에 테스트 케이스의 개수 NN이 주어진다. 이어서 NN개의 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 줄에는 nn, mm, XX, YY, ZZ가 공백 하나로 구분되어 주어진다. nn은 제한 속도 수열의 길이이고, mm은 생성 배열 AA의 길이다. 다음 mm개의 줄에는 A[0]A[0]부터 A[m1]A[m-1]까지 정수가 한 줄에 하나씩 주어진다.

AA, XX, YY, ZZ로 다음 의사 코드가 제한 속도 수열을 순서대로 출력한다. mod는 나머지 연산이다.

for i = 0 to n-1
  print A[i mod m]
  A[i mod m] = (X * A[i mod m] + Y * (i + 1)) mod Z

입력을 이렇게 생성하는 이유는 입력 크기를 줄이는 것뿐이고, 풀이 방법과는 관계가 없다.

제한:

  • 1N201 \le N \le 20
  • 1m1001 \le m \le 100
  • 0X1090 \le X \le 10^9
  • 0Y1090 \le Y \le 10^9
  • 1Z1091 \le Z \le 10^9
  • 0A[i]<Z0 \le A[i] < Z
  • 1mn10001 \le m \le n \le 1000

출력

각 테스트 케이스마다 Case #T: S 형식으로 한 줄씩 출력한다. TT는 테스트 케이스 번호이고, SS는 비어 있지 않은 엄격하게 증가하는 부분수열의 개수를 10000000071000000007로 나눈 나머지다.

힌트

n=6n = 6, m=2m = 2, X=2X = 2, Y=1000000000Y = 1000000000, Z=6Z = 6, A=(1,2)A = (1, 2)이면 의사 코드는 1,2,0,0,0,41, 2, 0, 0, 0, 4를 출력한다.