#P10891. 【烂题杯 Round 1】消灭劳嗝
【烂题杯 Round 1】消灭劳嗝
题目描述
你需要消灭劳嗝。
给定一个长度为 的排列 ,定义 ,您可以把它理解为以 开头的后缀的前缀最大值的下标集合。例如对于 ,,。
有 次询问,每次询问给出 ,求:
$$\left(\left(\sum_{l\le x\le y\le r} |S_x\cup S_y|-\sum_{\substack{{1\le x<l}\\{r<y\le n}}} |S_x\cup S_y|\right)\bmod P+P\right)\bmod P $$其中,。
输入格式
由于输入文件过大无法上传,接下来我们将会以一种诡异的方式读入数据。
第一行输入两个非负整数 、。表示排列长度、随机种子。
初始令 ,接下来输入一行一个整数 ,表示对排列的操作次数。
接下来我们将会对排列 进行 次操作,对于下标从 开始的第 次操作,令 $l=(X\times (X\oplus i))\bmod n+1,r=(X\oplus(i\times i))\bmod n+1$,你需要交换 与 。 表示按位异或。
对于 C++,代码实现如下:
l = (1ll * X * (X ^ i)) % n + 1;
r = (X ^ (1ll * i * i)) % n + 1;
接下来输入一行一个整数 ,表示询问组数。
对于下标从 开始的第 次询问,我们令 $l=\min((X\times i+(X\oplus (X\times i)))\bmod n,(X-i+(X\oplus (X+i)))\bmod n)+1,r=\max((X\times i+(X\oplus (X\times i)))\bmod n,(X-i+(X\oplus (X+i)))\bmod n)+1$。表示询问的参数。
对于 C++,代码实现如下:
l = min((1ll * X * i + (X ^ (1ll * X * i))) % n, (X - i + (X ^ (X + i))) % n) + 1;
r = max((1ll * X * i + (X ^ (1ll * X * i))) % n, (X - i + (X ^ (X + i))) % n) + 1;
输出格式
由于输出文件过大无法上传,接下来我们将会以一种诡异的方式输出数据。
输出一行一个整数,表示 次询问中所有答案的异或和。
5 3
4
5
998244304
10 114514
191981
3
998244191
提示
样例 1 解释:
操作后 。
对询问解密后真实询问如下:
4 5
2 3
1 5
3 4
3 5
对输出解密后真实输出如下:
5
998244350
33
1
11
对于第一个询问,,,。
对于倒数第二个询问,不要忘了 的项。
数据范围
对于 的数据,满足 、。
对于 的数据,满足 、。
对于 的数据,满足 、。
对于 的数据,满足 、。
对于 的数据,满足 ,,,, 互不相同。
请各位选手注意常数因子的影响。