곱셈으로 해시 주소 구하기
해시 테이블의 크기가 \(M\)일 때, 다음과 같은 곱셈법 해시 함수를 사용하려고 한다.
\(h(x)=\lfloor M(xA\bmod 1)\rfloor\)
여기서 \(xA\bmod 1\)은 \(xA\)의 소수 부분을 의미한다.
이 문제에서 모든 실수 계산은 64비트 배정밀도 부동소수점 자료형인 double을 사용한다. 수학적으로 정확한 실숫값이 아니라 double 자료형으로 계산된 값을 기준으로 한다.
각 데이터의 해시 주소는 다음 과정으로 구한다.
double자료형으로 \(xA\)를 계산한다.- \(xA\)에서 정수 부분을 빼 소수 부분을 구한다.
- 소수 부분에 \(M\)을 곱한 뒤 정수 부분만 취한다.
\(N\)개의 정수 \(x\)가 주어질 때, 각 정수의 해시 주소를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 데이터의 개수 \(N\), 해시 테이블의 크기 \(M\), 곱할 수 \(A\)가 공백으로 구분되어 주어진다.
둘째 줄에 \(N\)개의 정수 \(x_1,x_2,\dots,x_N\)이 공백으로 구분되어 주어진다.
출력
각 데이터의 해시 주소를 입력된 순서대로 공백으로 구분하여 출력한다.
제한 사항
- \(1 \le N \le 100,000\)
- \(1 \le M \le 100,000\)
- \(1 \le x_i \le 1,000,000,000\)
- \(0<A<1\)
예제 입력 1
4 16 0.375
2 7 10 15
예제 출력 1
12 10 12 10
코멘트