U632759 强制在线 O(1) 逆元

题目描述

Luminescent 给了你一个质数 $p$,Loyalty 有 $Q$ 组询问,她每次会给你一个整数 $x$,你需要告诉她,$x$ 在模 $p$ 意义下的乘法逆元是多少。 可以证明,在题目给出的数据范围下一定存在逆元。

输入格式

**请注意:您不需要阅读输入格式,您可以直接使用【说明/提示】部分给出的缺省源。** 第一行四个整数 $p,Q,op,ol$,分别表示初始给定的质数 $p$,询问次数 $Q$,题目给定的 IO 参数 $op$ 和题目给定的强制在线参数 $ol$。 若 IO 参数 $op=1$,则接下来 $Q$ 行,一行给定一个整数 $x$。 否则,给定一行一个整数 $seed$,使用下面的数据生成器生成出 $Q$ 次询问给出的 $x$。可以保证生成器生成出的 $x$ 满足 $x\in[1,p)$。 对于此时得到的整数 $x$,若 $ol=1$,则不进行任何处理。否则,你需要把 $x$ 赋值为其和上一次询问给出答案 $la$ 的按位异或值对 $p-1$ 取模然后加上 $1$ 得到的值,若这是第一次询问,则此时 $la=0$。

输出格式

**请注意:您不需要阅读输出格式,您可以直接使用【说明/提示】部分给出的缺省源。** 若 IO 参数 $op=1$,则接下来 $Q$ 行,一行一个整数,表示 $x$ 在模 $p$ 意义下的逆元。 否则,一行两个由一个空格分隔的整数,分别为全部 $Q$ 次询问得到答案的和,以及全部 $Q$ 次询问得到答案的异或和。

说明/提示

**本题采用 Subtask 捆绑测试。** Subtask #1($12$ 分):$p> p >> Q >> op >> ol; Your_Code::init(); if (op == 1) { int las = 0; while (Q--) { int x; cin >> x; if (!ol) x = (x ^ las) % (p - 1) + 1; cout seed; auto gen = [&]() { seed = seed * 1011031249904ull + 218105633ull; return seed % (p - 1) + 1; }; long long sum = 0; int Xor = 0, las = 0; while (Q--) { int x = gen(); if (!ol) x = (x ^ las) % (p - 1) + 1; int rep = Your_Code::solve(x); sum += rep, Xor ^= rep, las = rep; } cout