만드는 중입니다

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

K 아이템 쇼핑 스프리

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

요약
각 질의의 목표 가격 t에 대해, 가격 합이 t가 되는 길이 k의 인덱스 수열(반복과 순서 허용)의 개수를 997로 나눈 나머지로 구합니다.
난이도

어려움10점 중 8점

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

문제

개학 시즌이 되어 쇼핑 스프리에 당첨되었다. 이 스프리에는 흥미로운 규칙이 몇 가지 있다. 고를 수 있는 물건은 nn개이며, 이 중에서 kk개로 이루어진 수열을 반드시 골라야 한다. nn개 물건 중 어느 것이든 몇 번이고 원하는 만큼 선택할 수 있다. 쇼핑 스프리는 물건의 값이 아니라 선택한 물건의 번호로 구분되며, 대응하는 물건 번호 중 하나라도 다르면 두 스프리는 서로 다른 것으로 본다. 예를 들어 물건이 5개(번호 1부터 5까지)이고 그중 3개를 골라야 한다면, 다음은 모두 서로 다른 유효한 스프리이다: (1, 2, 1), (2, 1, 1), (2, 1, 3), (5, 5, 2), (3, 5, 4). 다시 말해 스프리는 물건 번호로 구분되며 물건의 값으로 구분하지 않는다. 앞의 두 스프리는 처음 고른 물건이 달라서 서로 다르다. 따라서 같은 물건 조합이라도 고르는 순서가 다르면 다른 스프리가 된다.

이 문제에서는 지정된 총합 값을 갖는 kk개 물건 쇼핑 스프리의 개수를 구해야 한다.

사용 가능한 물건의 개수, 각 물건의 값, kk의 값, 그리고 가격 목표 XX가 주어졌을 때, 총합이 정확히 XX가 되는 정확히 kk개 물건의 쇼핑 스프리 개수를 구하라. 가능한 스프리의 수가 매우 클 수 있으므로 997997로 나눈 나머지를 구하라.

입력

첫 줄에는 테스트 케이스의 개수를 나타내는 양의 정수 cc가 주어진다. 각 테스트 케이스는 사용 가능한 물건의 개수 nn (1≤n≤100001 \le n \le 10000)으로 시작한다. 이어지는 nn개의 줄에는 각 물건의 값(달러 단위)을 나타내는 소수점 아래 두 자리의 실수 pip_i (0.01≤pi≤500.000.01 \le p_i \le 500.00)가 한 줄에 하나씩 주어진다.

각 테스트 케이스의 다음 줄에는 공백으로 구분된 두 정수 kk (1≤k≤100001 \le k \le 10000)와 qq (1≤q≤100001 \le q \le 10000)가 주어진다. kk는 순서대로 선택할 물건의 개수이고, qq는 질의의 개수이다. 이어지는 qq개의 줄에는 각각 하나의 질의가 주어지며, 목표 값(달러 단위)을 나타내는 소수점 아래 두 자리의 실수 tt (0.01≤t≤500.000.01 \le t \le 500.00)이다.

출력

각 질의에 대해, 값이 질의 값과 같은 쇼핑 스프리의 개수를 997997로 나눈 나머지로 한 줄에 하나씩 출력하라. 각 테스트 케이스의 출력 뒤에는 빈 줄을 하나 출력하라.

예제1

  1. 예제 1

    입력
    3
    5
    0.07
    0.08
    0.12
    0.08
    0.15
    2 4
    0.12
    0.19
    0.15
    0.23
    2
    0.05
    0.08
    3 3
    0.18
    0.23
    0.24
    3
    1.00
    1.00
    1.00
    3 1
    3.00
    
    예상 출력
    0
    2
    4
    4
    
    3
    0
    1
    
    27