만드는 중입니다

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

부분 수열 합 쿼리

시간 제한2초메모리 제한256 MB

요약
배열과 정수 m(20 이하)이 주어질 때, 각 질의 구간 [l, r]에서 합이 m으로 나누어떨어지는 부분수열의 개수를 10^9+7로 나눈 나머지로 구합니다.
난이도

보통10점 중 6점

유형
분할 정복, 동적 계획법
정답자
아직 제출이 없습니다

문제

정수 nn개로 이루어진 배열 aa와 정수 mm이 주어진다. 질의 qq개에 답해야 한다. ii번째 질의는 정수 쌍 (li,ri)(l_i, r_i)로 주어진다. 각 질의마다 li≤j1<j2<⋯<jk≤ril_i \le j_1 < j_2 < \cdots < j_k \le r_i를 만족하고, 합 aj1+aj2+⋯+ajka_{j_1} + a_{j_2} + \cdots + a_{j_k}가 mm으로 나누어떨어지는 부분 수열 aj1,aj2,…,ajka_{j_1}, a_{j_2}, \ldots, a_{j_k}의 개수를 구한다. 달리 말하면, 부분 배열 [ali,ali+1,…,ari][a_{l_i}, a_{l_i+1}, \ldots, a_{r_i}]의 부분 수열 중 원소의 합이 mm의 배수인 것의 개수를 구한다.

입력

첫 줄에 정수 nn과 mm이 주어진다 (1≤n≤2×1051 \le n \le 2 \times 10^5, 1≤m≤201 \le m \le 20).

둘째 줄에 정수 aia_i가 nn개 주어진다 (0≤ai≤1090 \le a_i \le 10^9).

셋째 줄에 질의의 개수 qq가 주어진다 (1≤q≤2×1051 \le q \le 2 \times 10^5).

이어서 qq개의 줄에 각각 정수 lil_i와 rir_i가 주어진다 (1≤li≤ri≤n1 \le l_i \le r_i \le n).

출력

qq개의 줄을 출력한다. ii번째 줄에는 ii번째 질의의 답을 입력과 같은 순서로 출력한다. 답은 109+710^9+7로 나눈 나머지를 출력한다.

예제1

  1. 예제 1

    입력
    4 3
    5 1 3 2
    4
    1 2
    1 3
    1 4
    2 4
    
    예상 출력
    2
    4
    6
    4