luogu#P7953. [✗✓OI R1] 逆转比特

[✗✓OI R1] 逆转比特

题目背景

myy 正在广东佛山游玩,所以他出了一道 高明 的题目。

题目描述

一个点在长为 nn 的只含有 0/1 的序列上随机游走,点的初始坐标为 pp,重复进行以下操作:

  1. 当序列全为一种字符时,停止操作;
  2. 记点当前位置 pp,等概率随机选择一个点 qq,把点移动到 qq,将 qq 处的字符的取反,总代价加上 f(pq)f(|p-q|),这里 f(x)=Ax2+Bxf(x)=Ax^2+Bx,其中 A,BA,B 是两个给定常数;
  3. 回到第一条。

你需要进行 qq 次修改,具体而言,每次修改包括

  1. 将序列第 idx\mathit{idx} 位的 0/1 翻转;
  2. 查询初始坐标为 pp 时,停止操作后的期望代价。

注意,一旦修改一直有效

你需要输出 qq 次询问期望代价模 998244353998244353 的结果的异或和。

考虑到输入输出量比较大,数据采用如下随机生成方式

struct Random {
  unsigned long long X;
  void init(unsigned long long seed) { X = seed; }
  unsigned long long Rand() {
    X ^= X << 13;
    X ^= X >> 7;
    X ^= X << 17;
    return X;
  }
} R;

初始 01 串生成,会提供 seed1\mathit{seed1}

R.init(seed1);
for (int i = 1; i <= n; i++) seq[i] = R.Rand() & 1;

对于 qq 次询问,会提供 seed2\mathit{seed2}

R.init(seed2);
for (int i = 1; i <= q; i++) {
  idx = R.Rand() % n + 1, p = R.Rand() % n + 1;
  ans ^= query(idx, p);
}

输入格式

一行六个整数 n,q,seed1,seed2,A,Bn,q,\mathit{seed1},\mathit{seed2},A,B,具体含义见「题目描述」。

输出格式

一行一个整数 ans\mathit{ans},表示 qq 次询问期望代价模 998244353998244353 的结果的异或和。

3 3 114514 1919810 0 1
831870297
5 3 998244353 1000000007 1 1
694472000
21 17 233 234 5 17
367211664

提示

【样例解释】

对样例一的解释:
三次询问分别为:110110p=3p=3,答案为 114\dfrac{11}{4}010010p=3p=3,答案为 176\dfrac{17}{6}110110p=1p=1,答案为 114\dfrac{11}{4}。模 998244353998244353 意义下分别为 249561091249561091831870297831870297249561091249561091,异或和为 831870297831870297

【数据范围】

本题采用子任务评测。

对于 100%100\% 的数据,满足 3n3×1063 \leq n \leq 3\times10^61q3×1061 \leq q \leq 3\times10^60A,B<9982443530 \leq A, B < 998244353seed1,seed2[0,264)\mathit{seed1}, \mathit{seed2}\in [0, 2^{64})

子任务 nn\le qq\le 特殊性质 子任务得分 依赖子任务 时间限制
0 55 55 A 5 1s
1 5050 / 18 Subtask 0
2 600600 5050 12 Subtask 0~1
3 30003000 A 10 Subtask 0
4 / Subtask 0~3
5 3×1063\times10^6 45 Subtask 0~4 2s

特殊性质 A:A=0A = 0

按照惯例,这里应该有一个有趣的后记,但是已经阿克月赛的你想必是没有耐心去看的,所以没有。