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