아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

비료 주기

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

요약
N그루 중 키가 가장 작은 C_i그루가 날짜 수만큼 자랄 때 매일 K_i번째로 작은 키를 기록하고 그 합을 구합니다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 정렬, 힙
정답자
아직 제출이 없습니다

문제

경근이는 세계에서 제일가는 콩나무 농부가 되는 것이 꿈이다. 오늘도 꿈을 좇아 애쓰던 경근이는 식물에 뿌리기만 하면 쑥쑥 자라게 하는 비료 X를 마침내 개발했다. 다만 비료 X의 효과가 워낙 강해서 한 번에 제어할 자신이 없었던 경근이는 비료의 강도를 조금씩 높여 가며 콩나무 기르기에 익숙해지기로 했다.

경근이에게는 콩나무 씨앗 N개가 있다. 씨앗을 막 땅에 심었으므로 모든 나무의 높이는 0이다. 경근이는 앞으로 D일 동안 하루에 한 번씩 콩나무에 비료를 준다.

i번째 날(1 ≤ i ≤ D)에 비료를 흡수한 나무는 높이가 i만큼 자란다. 이날 비료를 받는 나무는 현재 높이가 가장 낮은 CiC_i개다. 높이가 같은 나무가 여럿이면 그중 무엇을 골라도 결과는 같다.

비료를 준 직후 경근이는 나무가 얼마나 잘 자랐는지 확인하려고 KiK_i번째로 작은 나무의 높이를 기록한다.

꿈이 너무 컸던 경근이는 감당할 수 없는 수의 콩나무를 심고 말았다. 경근이를 도와 D일 동안 기록한 높이의 합을 구하라.

입력

첫째 줄에 테스트 케이스의 수를 뜻하는 자연수 T가 주어진다. 이어서 T개의 테스트 케이스가 주어진다.

각 테스트 케이스는 한 줄에 정수 다섯 개 N, D, s, a, b로 주어지며, 값은 공백으로 구분된다 (1 ≤ N, D ≤ 100,000, 0 ≤ s, a, b ≤ 100,000).

CiC_i와 KiK_i는 s, a, b로 다음과 같이 생성한다. 중간 계산은 64비트 정수로 한다.

for (int i = 1; i <= D; i++) {
    Ci = s % N + 1;
    s = (s * a + b) % 1000000007;
    Ki = s % N + 1;
    s = (s * a + b) % 1000000007;
}

출력

각 테스트 케이스마다 D일 동안 기록한 나무 높이의 합을 한 줄에 출력한다. 이 합은 32비트 정수 범위를 넘을 수 있다.

예제1

  1. 예제 1

    입력
    3
    5 5 4 4 4
    5 5 3 3 3
    5 5 2 2 2
    
    예상 출력
    35
    30
    22