luogu#P5652. 基础博弈练习题

基础博弈练习题

题目背景

YSGH is our red sun.

题目描述

YSGH 和 YGSH 在打膈膜,YSGS 在旁边围观。

规则是这样的,先给定一个正整数 mm 和一个 nn 个数的序列 bb,一开始有一个棋子在 bb 的第一个位置,并将 b1b_1 减去 11。此后双方轮流操作,每次操作,假设当前棋子在 ii,可以把棋子移到一个位置 jj,满足 j[i,min(i+m,n)]j \in [i, \min(i + m, n)]bj>0b_j > 0,然后将 bjb_j11,YSGH 先手,谁先不能操作谁输。

众所周知,YSGH 和 YGSH 都是绝顶聪明的,所以两人都会使用最优策略。

而隔膜使用的序列 bb 是一个序列 aa 的一个连续非空子序列,当然序列 aa 和每次隔膜使用的序列 bb 都是 YSGS 定的。

现在他们进行了 qq 轮游戏,给出每轮游戏使用的区间,请你判断每轮谁会赢。

输入格式

由于本题数据规模较大,直接输入输出会占用比计算多数倍的时间,因此当询问过多时会对询问的输入输出进行了压缩。

第一行四个正整数 n,m,q,typen, m, q, typen,m,qn, m, q 意义同题面描述,typetype 表示当前数据的类型,type=1type = 1 说明该组数据进行了压缩,type=0type = 0 则说明没有,数据保证当 q>106q > {10}^6 时,type=1type=1

第二行 nn 个正整数,第 ii 个正整数表示 aia_i,意义同题面描述。

如果 type=1type = 1,第三行四个正整数 A,B,C,PA, B, C, P,表示询问的生成方式。

int A, B, C, P;
inline int rnd() { return A = (A * B + C) % P; }

每次询问时的调用方法为:

l = rnd() % n + 1, r = rnd() % n + 1;

如果生成的 l>rl > r,则还需要交换 l,rl, r

数据保证 0AB<P0 \le A B < P0C<P0 \le C < PP(B+1)<2311P (B + 1) < 2^{31} - 1

如果 type=0type=0,接下来 qq 行,每行两个正整数 l,rl, r,意义同题面描述。

输出格式

ansi{ans}_i 表示第 ii 次询问中 YSGH 是否会赢,如果会赢则 ansi=1{ans}_i = 1,否则 ansi=0{ans}_i = 0

输出一行一个整数,表示 $\displaystyle \left( \sum_{i = 1}^{q} i^2 \cdot {ans}_i \right)\! \bmod 2^{32}$。

5 2 3 0
2 4 1 2 3
1 5
3 5
3 4
5

提示

对于 25%25\% 的数据,n,m,q10n, m, q \le 10ai2a_i \le 2
对于 55%55\% 的数据,n,m,q5×103n, m, q \le 5 \times {10}^3
另有 15%15\% 的数据,n105n \le {10}^5m5m \le 5
对于 90%90\% 的数据,n,m,q106n, m, q \le {10}^6
对于 100%100\% 的数据,1n,m1061 \le n, m \le {10}^61q1071 \le q \le {10}^71ai1091 \le a_i \le {10}^9