주어진 상한 K마다 길이가 N이고 원소가 1부터 K 사이인 리스트 중 1보다 큰 각 값이 마지막 등장보다 앞에 직전 값을 두는 경우의 수를 셉니다.
어려움8조합론동적 계획법수학아직 제출이 없습니다시간 제한3초메모리 제한256 MB유르겐 군터스바르츠하펜슈트라센은 기타 연주 실력과 제자를 혹독하게 가르치는 방식으로 알려져 있다. 사람들이 잘 모르는 사실이 하나 더 있다. 그는 숫자도 좋아한다.
요즘 유르겐은 정렬된 리스트를 살펴보다가 싫증이 났다. 정렬된 리스트는 너무 뻔하고 개수도 적어서, 규칙을 조금 바꿔 보기로 했다.
양의 정수 N개로 이루어진 리스트 ℓ이 있다. 원소가 서로 달라야 하는 것은 아니다. ℓ에 나오는 모든 정수 x>1에 대해 ℓ에서 x가 마지막으로 나오는 자리보다 앞에 x−1이 한 번 이상 나오면, 유르겐은 이 리스트를 살짝 정렬된 리스트라고 부른다. 예를 들면 다음과 같다.
유르겐은 원소가 모두 K 이하의 양의 정수이고 길이가 N인 살짝 정렬된 리스트가 몇 개인지 알고 싶다. 두 리스트는 한 자리라도 원소가 다르면 서로 다른 리스트다. 유르겐 대신 그 개수를 세어 보자.
첫째 줄에 리스트의 길이 N과 질의의 개수 Q가 주어진다 (1≤N≤5000, 1≤Q≤1000). 둘째 줄에 정수 K1,K2,…,KQ가 주어진다. i번째 질의에서 세어야 하는 리스트는 Ki보다 큰 값을 포함하지 않는다 (1≤Ki≤109).
한 줄에 정수 Q개를 공백 하나로 구분해 출력한다. i번째 정수는 원소가 모두 Ki 이하의 양의 정수이고 길이가 N인 살짝 정렬된 리스트의 개수다. 이 값이 매우 클 수 있으므로 109+7로 나눈 나머지를 출력한다.