생성기

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

요약
각 생성기의 도달 가능한 최댓값을 구한 뒤 k로 나누어떨어지지 않도록 손실이 가장 작은 값 하나를 낮춰 합을 구합니다.
난이도

보통10점 중 4점

유형
그리디, 시뮬레이션
정답자
아직 제출이 없습니다

문제

선형 합동 생성기(LCG)는 음이 아닌 정수 x0x_0을 시드로 삼아 시작하고, 0≤xi<c0 \le x_i < c를 만족하는 정수 수열 xix_i를 무한히 만든다.

xi+1=(a⋅xi+b) mod cx_{i+1} = (a \cdot x_i + b) \bmod c

aa, bb, cc는 음이 아닌 정수이고 0≤x0<c0 \le x_0 < c이다.

생성기 nn개가 주어진다. jj번 생성기의 매개변수는 x0(j)x_0^{(j)}, a(j)a^{(j)}, b(j)b^{(j)}, c(j)c^{(j)}이고, 이 생성기는 수열 xi(j)x_i^{(j)}를 만든다. 수열 nn개에서 항을 하나씩 골라, 고른 항의 합을 최대로 하면서 그 합이 kk의 배수가 되지 않게 하려고 한다.

식으로 쓰면 1≤j≤n1 \le j \le n에 대해 정수 tj≥0t_j \ge 0을 골라, s mod k≠0s \bmod k \neq 0이라는 조건 아래에서 s=∑j=1nxtj(j)s = \sum_{j=1}^{n} x_{t_j}^{(j)}를 최대로 만드는 것이다.

입력

첫째 줄에 정수 nn과 kk가 주어진다 (1≤n≤1041 \le n \le 10^4, 1≤k≤1091 \le k \le 10^9).

다음 nn개 줄에는 생성기 하나를 나타내는 정수 네 개 x0(j)x_0^{(j)}, a(j)a^{(j)}, b(j)b^{(j)}, c(j)c^{(j)}가 주어진다 (0≤a(j),b(j)≤10000 \le a^{(j)}, b^{(j)} \le 1000, 0≤x0(j)<c(j)≤10000 \le x_0^{(j)} < c^{(j)} \le 1000).

출력

kk의 배수가 아닌 합을 만들 수 없으면 첫째 줄에 -1을 출력한다.

만들 수 있으면 첫째 줄에 최대 합 ss를 출력하고, 둘째 줄에 인덱스 t1,t2,…,tnt_1, t_2, \dots, t_n을 공백 하나로 구분해 출력한다 (0≤tj≤1090 \le t_j \le 10^9).

같은 최대 합을 만드는 인덱스 조합이 여러 가지일 수 있으므로, 다음 규칙이 정하는 조합을 그대로 출력한다. jj번 수열에 나타나는 값 중 가장 큰 값을 mjm_j라 하고, S=m1+m2+⋯+mnS = m_1 + m_2 + \dots + m_n이라 하자.

  • S mod k≠0S \bmod k \neq 0이면 s=Ss = S이고, 모든 생성기가 자기 수열의 최댓값 mjm_j를 고른다.
  • 그렇지 않으면 각 생성기 jj에 대해, jj번 수열에 나타나면서 (mj−v) mod k≠0(m_j - v) \bmod k \neq 0을 만족하는 값 vv 중 가장 큰 것을 pjp_j라 하고 dj=mj−pjd_j = m_j - p_j라 하자. 그런 vv가 없는 생성기는 이 단계에서 제외한다. 그런 vv가 있는 생성기가 하나도 없으면 -1을 출력한다. 있으면 djd_j의 최솟값을 DD, dj=Dd_j = D인 가장 작은 번호를 qq라 할 때 s=S−Ds = S - D이고, qq번 생성기는 pqp_q를 고르며 나머지 생성기는 모두 자기 수열의 최댓값 mjm_j를 고른다.

각 생성기에 대해, 고른 값이 그 수열에서 처음 나타나는 인덱스 tjt_j를 출력한다.

참고

첫 번째 예제에서 첫 생성기는 1, 2, 3, 4, 5, 0, 1, 2, ...를 만들고, 둘째 생성기는 2, 3, 2, 3, 2, ...를 만든다.

두 번째 예제에서 첫 생성기는 0, 2, 0, 2, 0, ...을 만들고, 둘째 생성기는 2, 4, 2, 4, 2, ...를 만든다.

예제2

  1. 예제 1

    입력
    2 3
    1 1 1 6
    2 4 0 5
    
    예상 출력
    8
    4 1
    
  2. 예제 2

    입력
    2 2
    0 7 2 8
    2 5 0 6
    
    예상 출력
    -1