부분 수열 해시

주어진 배열의 비어 있지 않은 부분수열 중 사전 순으로 가장 작은 K개를 골라 각 다항 해시를 출력합니다.

어려움8정렬조합론아직 제출이 없습니다시간 제한1초메모리 제한256 MB

문제

길이가 NN인 정수 배열이 주어진다. 이 배열의 비어 있지 않은 부분 수열을 모두 사전순으로 정렬한 결과를 s1,s2,,sqs_1, s_2, \dots, s_q라고 하자. 부분 수열은 원래 배열에서 원소를 0개 이상 지워서 만드는 배열이다. 값이 서로 같은 부분 수열이 여러 개 나올 수 있고, q=2N1q = 2^N - 1이다.

배열 AA가 배열 BB보다 사전순으로 앞선다는 것은, 두 배열이 처음으로 달라지는 위치 ii에서 Ai<BiA_i < B_i이거나 AABB의 진 접두사인 경우를 뜻한다.

값이 v1,v2,,vpv_1, v_2, \dots, v_p인 배열의 해시는 다음과 같이 정의한다.

h(s)=(v1Bp1+v2Bp2++vp1B+vp)modMh(s) = (v_1 B^{p-1} + v_2 B^{p-2} + \dots + v_{p-1} B + v_p) \bmod M

BBMM은 입력으로 주어지는 정수다. KK가 주어질 때 h(s1),h(s2),,h(sK)h(s_1), h(s_2), \dots, h(s_K)를 구한다.

입력

첫째 줄에 정수 NN, KK, BB, MM이 주어진다. (1N1000001 \le N \le 100\,000, 1K1000001 \le K \le 100\,000, 1B,M10000001 \le B, M \le 1\,000\,000)

둘째 줄에 정수 a1,a2,,aNa_1, a_2, \dots, a_N이 주어진다. (1ai1000001 \le a_i \le 100\,000)

모든 입력에서 K2N1K \le 2^N - 1이 성립한다.

출력

KK개의 줄을 출력한다. jj번째 줄에는 h(sj)h(s_j)를 출력한다.

힌트

첫 번째 예제에서 정렬된 부분 수열은 s1=[1]s_1 = [1], s2=[1,2]s_2 = [1, 2], s3=[2]s_3 = [2]이다. 따라서 h(s1)=1mod5=1h(s_1) = 1 \bmod 5 = 1, h(s2)=(1+2)mod5=3h(s_2) = (1 + 2) \bmod 5 = 3, h(s3)=2mod5=2h(s_3) = 2 \bmod 5 = 2이다.

두 번째 예제에서 정렬된 부분 수열은 s1=[1]s_1 = [1], s2=[1]s_2 = [1], s3=[1,1]s_3 = [1, 1], s4=[1,3]s_4 = [1, 3]이다. 값이 1인 원소가 두 개이므로 [1][1]이 두 번 나온다. 따라서 h(s1)=1mod3=1h(s_1) = 1 \bmod 3 = 1, h(s2)=1mod3=1h(s_2) = 1 \bmod 3 = 1, h(s3)=(1×2+1)mod3=0h(s_3) = (1 \times 2 + 1) \bmod 3 = 0, h(s4)=(1×2+3)mod3=2h(s_4) = (1 \times 2 + 3) \bmod 3 = 2이다.