基础博弈练习题
题目背景
YSGH is our red sun.
题目描述
YSGH 和 YGSH 在打膈膜,YSGS 在旁边围观。
规则是这样的,先给定一个正整数 $m$ 和一个 $n$ 个数的序列 $b$,一开始有一个棋子在 $b$ 的第一个位置,并将 $b_1$ 减去 $1$。此后双方轮流操作,每次操作,假设当前棋子在 $i$,可以把棋子移到一个位置 $j$,满足 $j \in [i, \min(i + m, n)]$ 且 $b_j > 0$,然后将 $b_j$ 减 $1$,YSGH 先手,谁先不能操作谁输。
众所周知,YSGH 和 YGSH 都是绝顶聪明的,所以两人都会使用最优策略。
而隔膜使用的序列 $b$ 是一个序列 $a$ 的一个连续非空子序列,当然序列 $a$ 和每次隔膜使用的序列 $b$ 都是 YSGS 定的。
现在他们进行了 $q$ 轮游戏,给出每轮游戏使用的区间,请你判断每轮谁会赢。
输入输出格式
输入格式
由于本题数据规模较大,直接输入输出会占用比计算多数倍的时间,因此当询问过多时会对询问的输入输出进行了压缩。
第一行四个正整数 $n, m, q, type$,$n, m, q$ 意义同题面描述,$type$ 表示当前数据的类型,$type = 1$ 说明该组数据进行了压缩,$type = 0$ 则说明没有,数据保证当 $q > {10}^6$ 时,$type=1$。
第二行 $n$ 个正整数,第 $i$ 个正整数表示 $a_i$,意义同题面描述。
如果 $type = 1$,第三行四个正整数 $A, B, C, P$,表示询问的生成方式。
```cpp
int A, B, C, P;
inline int rnd() { return A = (A * B + C) % P; }
```
每次询问时的调用方法为:
```cpp
l = rnd() % n + 1, r = rnd() % n + 1;
```
如果生成的 $l > r$,则还需要交换 $l, r$。
数据保证 $0 \le A B < P$,$0 \le C < P$,$P (B + 1) < 2^{31} - 1$。
如果 $type=0$,接下来 $q$ 行,每行两个正整数 $l, r$,意义同题面描述。
输出格式
令 ${ans}_i$ 表示第 $i$ 次询问中 YSGH 是否会赢,如果会赢则 ${ans}_i = 1$,否则 ${ans}_i = 0$。
输出一行一个整数,表示 $\displaystyle \left( \sum_{i = 1}^{q} i^2 \cdot {ans}_i \right)\! \bmod 2^{32}$。
输入输出样例
输入样例 #1
5 2 3 0
2 4 1 2 3
1 5
3 5
3 4
输出样例 #1
5
说明
对于 $25\%$ 的数据,$n, m, q \le 10$,$a_i \le 2$。
对于 $55\%$ 的数据,$n, m, q \le 5 \times {10}^3$。
另有 $15\%$ 的数据,$n \le {10}^5$,$m \le 5$。
对于 $90\%$ 的数据,$n, m, q \le {10}^6$。
对于 $100\%$ 的数据,$1 \le n, m \le {10}^6$,$1 \le q \le {10}^7$,$1 \le a_i \le {10}^9$。