작은 점화식으로 생성된 수열에서 위치를 기준으로 서로 다른 순증가 부분수열의 개수를 1000000007로 나눈 나머지를 구한다.
보통6동적 계획법정렬조합론누적 합아직 제출이 없습니다시간 제한5초메모리 제한512 MB고속도로를 달리다가 과속으로 경찰에 잡혔다. 경찰은 한동안 뒤를 따라오고 있었고, 브레이크를 한 번도 밟지 않고 계속 가속만 했다는 사실에 놀랐다. 이제 그럴듯한 변명이 필요하다.
"내가 본 제한 속도 표지판은 모두 커지는 순서였다. 그래서 계속 가속했다"라고 말하기로 했다. 경찰은 웃으면서 그 구간에 세워진 표지판을 순서대로 전부 알려주고, 그중에서 커지는 순서로 놓인 것만 보게 될 만큼 운이 좋았을 리는 없다고 한다.
그 운이 어느 정도인지 가늠해 보자. 주어진 수열에서 엄격하게 증가하는 부분수열이 몇 개인지 세면 된다. 빈 부분수열은 세지 않는다. 표지판을 하나도 보지 않았다는 뜻이 되기 때문이다.
부분수열은 값이 아니라 위치로 구분한다. 예를 들어 수열 (1,4,2,3,5,5)에서 값이 (1,2,5)인 엄격하게 증가하는 부분수열은 5를 고르는 방법이 두 가지이므로 두 번 센다.
첫 줄에 테스트 케이스의 개수 N이 주어진다. 이어서 N개의 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 줄에는 n, m, X, Y, Z가 공백 하나로 구분되어 주어진다. n은 제한 속도 수열의 길이이고, m은 생성 배열 A의 길이다. 다음 m개의 줄에는 A[0]부터 A[m−1]까지 정수가 한 줄에 하나씩 주어진다.
A, X, Y, Z로 다음 의사 코드가 제한 속도 수열을 순서대로 출력한다. 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
입력을 이렇게 생성하는 이유는 입력 크기를 줄이는 것뿐이고, 풀이 방법과는 관계가 없다.
제한:
각 테스트 케이스마다 Case #T: S 형식으로 한 줄씩 출력한다. T는 테스트 케이스 번호이고, S는 비어 있지 않은 엄격하게 증가하는 부분수열의 개수를 1000000007로 나눈 나머지다.
n=6, m=2, X=2, Y=1000000000, Z=6, A=(1,2)이면 의사 코드는 1,2,0,0,0,4를 출력한다.