만드는 중입니다

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

잘못된 해시 학생들

시간 제한5초메모리 제한512 MB

요약
n, k1, alpha가 주어질 때, 잘못된 탐사 수열 k_i = k1 + alpha*k_{i-1}^2 mod n이 반복되기 전까지 방문하는 서로 다른 칸의 개수를 센다.
난이도

어려움10점 중 8점

유형
수학, 정수론, 시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

해시 테이블은 컴퓨터 과학에서 널리 쓰이는 자료 구조로, 서로 다른 항목을 비교적 작은 배열에 저장할 수 있게 해 준다. 해시 테이블에는 여러 구현 방식이 있고, 오버플로와 충돌을 처리하는 방법도 다양하다. 그중 하나는 개방 주소법과 이차 탐사(quadratic probe)를 사용하는 해싱이다.

동작 방식은 다음과 같다. 고정된 정수 상수 α\alpha에 대해 해시 테이블 TT의 길이가 nn이고 셀 T[0]T[0], T[1]T[1], T[2]T[2], ..., T[n−1]T[n-1]로 이루어져 있다고 하자. 객체를 저장하려면 먼저 초기 해시 함수를 적용해 초기 키 k1k_1을 계산하는데, 이는 0과 n−1n-1 사이의 인덱스일 뿐이다. TT의 k1k_1 위치에 객체를 저장하려고 시도한다. T[k1]T[k_1]이 이미 사용 중이면 인덱스 k2=k1+α⋅12mod  nk_2 = k_1+\alpha\cdot 1^2 \mod n인 다른 위치를 시도한다. T[k2]T[k_2]도 이미 사용 중이면 ki=k1+α⋅(i−1)2mod  n for i=3,4,5,…,k_i = k_1+\alpha\cdot (i-1)^2 \mod n \text{ for } i= 3,4,5, \dots,인 위치에서 탐사를 계속하고, 배열 TT에서 처음으로 비어 있는 위치를 찾을 때까지 이어진다. nn번 탐사한 뒤에도 TT에서 빈 셀을 찾지 못하면 포기하고 예외를 발생시킨다. 이런 저장 방식은 초기 키 k1k_1을 계산하는 해시 함수가 정수 구간 [ ⁣[0,n−1] ⁣][\![ 0,n-1]\!]에 값을 균일하게 분포시키고, 저장할 객체의 수 mm이 nn보다 조금 작을 때 잘 동작한다고 여겨진다.

Amaretto 교수 수업의 2학년 학생들은 해시 테이블을 구현하라는 과제를 받았다. 그런데 단 한 명도 제대로 해내지 못했다. Mayor 교수의 1학년 수업에서는 결코 일어나지 않았을 끔찍한 상황이다. Amaretto 교수가 학생들이 짠 코드를 이해하는 데는 오랜 시간이 걸렸다. 학생들의 첫 번째 실수는 복잡하게 고른 초기 해시 함수에 버그가 있어 항상 같은 값 k1k_1을 반환한다는 점이었다. 두 번째 실수는 모두 올바른 공식 대신 ki=k1+α⋅ki−12mod  nk_i = k_1+\alpha\cdot {k_{i-1}}^2 \mod n이라는 공식을 코딩했다는 점이었다.

그래도 Amaretto 교수는 잘못된 해시를 짠 학생들이 엉망으로 구현한 이 고장 난 해시 테이블이 얼마나 쓸 만한지 궁금해한다.

입력

입력 파일은 여러 테스트 케이스로 이루어진다. 입력 파일의 첫 줄에는 테스트 케이스의 수를 나타내는 정수 cc가 하나 주어진다. 각 테스트 케이스는 정수 nn, k1k_1, α\alpha가 단일 공백으로 구분되어 한 줄에 주어지며, nn (2≤n≤2000000002\le n \le 200000000)은 해시 테이블의 크기, k1k_1 (0≤k1≤n−10\le k_1 \le n-1)은 잘못 코딩된 초기 해시 함수가 항상 반환하는 값, α\alpha (1≤α≤n−11\le \alpha \le n-1이고 α≤100\alpha \le 100)는 버그가 있는 이차 탐사에 사용되는 계수이다.

출력

입력의 각 테스트 케이스마다 해시 테이블에서 값을 할당할 수 있는 셀의 수를 나타내는 정수 하나를 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    2
    3 0 1
    7 3 3
    
    예상 출력
    1
    4