길이가 $N$인 수열 $A_1, A_2, \cdots, A_N$이 주어진다. 다음 $Q$개의 쿼리를 수행하는 프로그램을 작성하여라.
여기서 $C(n) = \frac{(2n)!}{n!(n+1)!}$으로 정의되는 카탈란 수이다.
이 문제의 수열과 쿼리를 생성하기 위한 $N$, $Q$, $seed$가 주어진다. 이후 각 수열과 쿼리는 유사 난수 생성기 Splitmix64로 생성된다. 각 수열과 쿼리를 만드는 방법은 다음과 같으며, 언어별 구현은 노트를 참고하여라. (C, C++, Java, Python, Rust, Ruby)
$0$이상 $2^{64}$미만의 수 $x$에 대해 $\textrm{splitmix64}(x)$는 다음과 같이 정의된다. 여기서, $\oplus$는 비트간 배타적 논리합 (bitwise XOR), $a +_{2^{64}} b$는 $(a+b) \bmod {2^{64}}$, $a \times_{2^{64}} b$는 $(a \times b) \bmod {2^{64}}$, $a >> b$는 $\left\lfloor\frac{a}{2^b}\right\rfloor$를 의미한다.
수열 길이 $N+4Q+1$의 수열 $S$는 다음과 같이 정의된다.
문제에서 주어지는 수열 $A$는 다음과 같이 주어진다. $(1 \le i \le N)$
문제에서 주어지는 $j$번째 쿼리 $t_j$ $l_j$ $r_j$ $x_j$는 다음과 같이 주어진다. $(1 \le j \le Q)$
첫 번째 줄에 공백으로 구분된 세 정수 $N, Q, seed$가 주어진다. $(2 \le N \le 10^5;$ $1 \le Q \le 10^5;$ $1 \le seed \le 10^{18})$
문제의 방법으로 수열과 쿼리를 생성했을 때 $t_j$가 $3$ 혹은 $4$인 쿼리가 $1$개 이상 주어짐이 보장된다.
$t_j$가 $3, 4$인 쿼리에 대해, 계산된 값을 한 줄에 하나씩 출력한다.
다음은 각 언어별로 문제의 데이터 생성 방법을 구현한 파일이다.
C: splitmix64.c (C99)
generate(int32_t N, int32_t Q, uint64_t seed)를 호출한다.d에 대해 $A_i$는 d.arr[i]에, $t_j, l_j, r_j, x_j$은 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에 대해 $A_i$는 d.arr[i]에, $t_j, l_j, r_j, x_j$은 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에 대해 $A_i$는 d.arr[i]에, $t_j, l_j, r_j, x_j$은 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에 대해 $A_i$는 d.arr[i]에, $t_j, l_j, r_j, x_j$은 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에 대해 $A_i$는 d.arr[i]에, $t_j, l_j, r_j, x_j$은 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에 대해 $A_i$는 d.arr[i]에, $t_j, l_j, r_j, x_j$은 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]은 문제의 수열 혹은 쿼리를 저장하고 있지 않음에 유의하여라.