카탈란과 수열과 쿼리
시간 제한1.5초메모리 제한1024 MB
구간 대입, 구간 덧셈(10^6 나머지), 그리고 카탈란 수와 거듭제곱으로 가중된 합을 묻는 두 종류의 쿼리를 처리하는 문제입니다.
문제
길이가 인 수열 이 주어진다. 다음 개의 쿼리를 수행하는 프로그램을 작성하여라.
- : 에 대해, 를 로 바꾼다.
- : 에 대해, 를 으로 바꾼다.
- : 을 출력한다.
- : 에 대해 길이 의 배열 를 로 설정한 후, 를 오름차순으로 정렬한다.을 출력한다.
여기서 으로 정의되는 카탈란 수이다.
이 문제의 수열과 쿼리를 생성하기 위한 , , 가 주어진다. 이후 각 수열과 쿼리는 유사 난수 생성기 Splitmix64로 생성된다. 각 수열과 쿼리를 만드는 방법은 다음과 같으며, 언어별 구현은 노트를 참고하여라. (C, C++, Java, Python, Rust, Ruby)
-
이상 미만의 수 에 대해 는 다음과 같이 정의된다. 여기서, 는 비트간 배타적 논리합 (bitwise XOR), 는 , 는 , 는 를 의미한다.
-
수열 길이 의 수열 는 다음과 같이 정의된다.
-
문제에서 주어지는 수열 는 다음과 같이 주어진다.
-
문제에서 주어지는 번째 쿼리 는 다음과 같이 주어진다.
입력
첫 번째 줄에 공백으로 구분된 세 정수 가 주어진다.
문제의 방법으로 수열과 쿼리를 생성했을 때 가 혹은 인 쿼리가 개 이상 주어짐이 보장된다.
출력
가 인 쿼리에 대해, 계산된 값을 한 줄에 하나씩 출력한다.
힌트
다음은 각 언어별로 문제의 데이터 생성 방법을 구현한 파일이다.
-
C: splitmix64.c (C99)
- 문제에 주어진 , , 를 사용해서
generate(int32_t N, int32_t Q, uint64_t seed)를 호출한다. - 호출한 결과
d에 대해 는d.arr[i]에, 은d.query[j][0],d.query[j][1],d.query[j][2],d.query[j][3]에 저장되어 있다.d의 타입은data, 각 정수의 타입은int32_t이며,d.arr[0]혹은d.query[0]은 문제의 수열 혹은 쿼리를 저장하고 있지 않음에 유의하여라.
- 호출한 결과
d에 대해 메모리를 해제하기 위해서는free_data(d)를 호출한다.
- 문제에 주어진 , , 를 사용해서
-
C++: splitmix64.cpp (C++14, C++17, C++20, C++23, C++26, C++17 (Clang), C++20 (Clang))
- 문제에 주어진 , , 를 사용해서
Generate(int32_t N, int32_t Q, uint64_t seed)를 호출한다. - 호출한 결과
d에 대해 는d.arr[i]에, 은d.query[j][0],d.query[j][1],d.query[j][2],d.query[j][3]에 저장되어 있다.d의 타입은Data, 각 정수의 타입은int32_t이며,d.arr[0]혹은d.query[0]은 문제의 수열 혹은 쿼리를 저장하고 있지 않음에 유의하여라.
- 문제에 주어진 , , 를 사용해서
-
Java: Splitmix64.java (Java 8, Java 8 (OpenJDK), Java 11)
- 문제에 주어진 , , 를 사용해서
generate(int n, int q, long seed)를 호출한다. - 호출한 결과
d에 대해 는d.arr[i]에, 은d.query[j][0],d.query[j][1],d.query[j][2],d.query[j][3]에 저장되어 있다.d의 타입은data, 각 정수의 타입은int이며,d.arr[0]혹은d.query[0]은 문제의 수열 혹은 쿼리를 저장하고 있지 않음에 유의하여라.
- 문제에 주어진 , , 를 사용해서
-
Python: splitmix64.py (Python 3, Pypy3)
- 문제에 주어진 , , 를 사용해서
generate(n: int, q: int, seed: int)를 호출한다. - 호출한 결과
d에 대해 는d.arr[i]에, 은d.query[j][0],d.query[j][1],d.query[j][2],d.query[j][3]에 저장되어 있다.d의 타입은Data, 각 정수의 타입은int이며,d.arr[0]혹은d.query[0]은 문제의 수열 혹은 쿼리를 저장하고 있지 않음에 유의하여라.
- 문제에 주어진 , , 를 사용해서
-
Rust: splitmix64.rs (Rust 2021)
- 문제에 주어진 , , 를 사용해서
generate(n: usize, q: usize, seed: u64)를 호출한다. - 호출한 결과
d에 대해 는d.arr[i]에, 은d.query[j][0],d.query[j][1],d.query[j][2],d.query[j][3]에 저장되어 있다.d의 타입은Data, 각 정수의 타입은usize이며,d.arr[0]혹은d.query[0]은 문제의 수열 혹은 쿼리를 저장하고 있지 않음에 유의하여라.
- 문제에 주어진 , , 를 사용해서
-
Ruby: splitmix64.rb (Ruby)
- 문제에 주어진 , , 를 사용해서
generate(n, q, seed)를 호출한다. n,q,seed의 타입은Integer이다.- 호출한 결과
d에 대해 는d.arr[i]에, 은d.query[j][0],d.query[j][1],d.query[j][2],d.query[j][3]에 저장되어 있다.d의 타입은Data_, 각 정수의 타입은Integer이며,d.arr[0]혹은d.query[0]은 문제의 수열 혹은 쿼리를 저장하고 있지 않음에 유의하여라.
- 문제에 주어진 , , 를 사용해서