题目描述
你需要消灭劳嗝。
给定一个长度为 n 的排列 A=a1,a2,⋯,an,定义 Si={x∣x≥i∧maxi≤k≤xak≤ax},您可以把它理解为以 i 开头的后缀的前缀最大值的下标集合。例如对于 A={3,5,2,1,4},S1={1,2},S3={3,5}。
有 q 次询问,每次询问给出 l,r,求:
l≤x≤y≤r∑∣Sx∪Sy∣−1≤x<lr<y≤n∑∣Sx∪Sy∣modP+PmodP其中,P=998244353。
输入格式
由于输入文件过大无法上传,接下来我们将会以一种诡异的方式读入数据。
第一行输入两个非负整数 n、X。表示排列长度、随机种子。
初始令 ai=i,接下来输入一行一个整数 c,表示对排列的操作次数。
接下来我们将会对排列 A 进行 c 次操作,对于下标从 1 开始的第 i 次操作,令 l=(X×(X⊕i))modn+1,r=(X⊕(i×i))modn+1,你需要交换 al 与 ar。⊕ 表示按位异或。
对于 C++,代码实现如下:
接下来输入一行一个整数 q,表示询问组数。
对于下标从 1 开始的第 i 次询问,我们令 l=min((X×i+(X⊕(X×i)))modn,(X−i+(X⊕(X+i)))modn)+1,r=max((X×i+(X⊕(X×i)))modn,(X−i+(X⊕(X+i)))modn)+1。表示询问的参数。
对于 C++,代码实现如下:
输出格式
由于输出文件过大无法上传,接下来我们将会以一种诡异的方式输出数据。
输出一行一个整数,表示 q 次询问中所有答案的异或和。
提示
样例 1 解释:
操作后 A={1,5,4,2,3}。
对询问解密后真实询问如下:
对输出解密后真实输出如下:
对于第一个询问,S4={4,5},S5={5},∣S4∪S4∣+∣S4∪S5∣+∣S5∪S5∣=5。
对于倒数第二个询问,不要忘了 1≤x<l,r<y≤n 的项。
数据范围:
对于 20% 的数据,满足 1≤n≤100、1≤q≤100。
对于 40% 的数据,满足 1≤n≤100、1≤q≤105。
对于 60% 的数据,满足 1≤n≤105、1≤q≤105。
对于 80% 的数据,满足 1≤n≤3×106、1≤q≤3×106。
对于 100% 的数据,满足 1≤n≤107,1≤q≤107,0≤c≤107,0≤X≤109,ai 互不相同。
请各位选手注意常数因子的影响。