你觉得 map / unordered_map 太慢了,因为它们可能会让你 TLE!
给定一个 std::map h,你需要维护 n 次操作:
由于输入很大,给定随机数种子 seed 和上限 p,请使用如下伪随机数生成算法获得每个输入:
#include <bits/stdc++.h>
using namespace std;
long long seed, p, n, a;
long long nextRand()
{
static long long x = seed;
x ^= x << 14;
x ^= x >> 45;
x ^= x << 11;
return (x % p + p) % p;
}
signed main()
{
cin >> n >> seed >> p;
for (int i = 1; i <= n; ++i)
{
long long op = nextRand() % 2;
if (op == 0) // 操作 1
{
long long x = nextRand();
//你的解题代码
}
else
{
long long x = nextRand();
long long y = nextRand();
//你的解题代码
}
}
return 0;
}
由于输出也很大,设每次操作 1 得到的输出依次是 ans_1,\cdots, ans_k,请你输出一个整数 ans_1\oplus ans_2\oplus\cdots\oplus ans_k,即每个答案的异或。
输入
输出一行三个整数 n,seed,p(1\le n,p\le 10^7,1\le seed\le 10^9)。
输出
输出一行一个整数,代表你的答案。
样例
标准输入 复制文本 |
8 114514 3 |
标准输出 复制文本 |
-3 |
提示
对样例,得到的输入是:
2 2
1 2
1
2 1
1 0
1 2
0
2 2
前两次操作二后,有 h[1]=h[2]=2,故第一次询问输出 2;后三次操作二之后有 h[1]=2,h[2]=1,故第二次询问输出 -1。因为 (-1)\oplus 2=-3,故输出 -3。
请注意本题的空间限制为 64MB。