### 【背景描述】 小C在研究数组的xor。 她有一个长度为 $n$ 的数组 $A$ 。 她每次会把 $a_{i-1}$ 和 $a_i$ 异或起来,然后 $A$ 的长度会变成 $n - 1$ 这么操作了 $n - 1$ 次之后得到了长度为$1$的数组。 她想知道在操作过程中每次的 $a_1$ 为多少? 为了避免输出过大,请输出第 $j$ 次操作后的 $a_1 \times (j + 1)$ 的异或和 $(0 \leq j \leq n - 1)$ 。 ### 【输入格式】 一行五个整数$n$, $a$, $b$, $c$, $d$。 数组$A$以如下方式生成,$a_1 = a$, $a_i = (a_{i-1}^2 + b \times a_{i-1} + c) \mod d$ ### 【输出格式】 一行一个整数表示答案。 ### 【样例输入】 ``` 5 3 2 4 15 ``` ### 【样例输出】 ``` 89 ``` 解释: ```cpp 3 4 13 4 13 7 9 9 9 14 0 0 14 0 14 ``` ### 【数据规模】 $30\%$ 的分数, $n <= 10^3, a, b, c, d <= 10^9$ 另外 $10\%$ 的分数, $d = 2$ 另外 $30\%$ 的分数, $d <= 50$ $100\%$ 的分数, $n <= 8 \times 10^6, a, b, c, d <= 10^9, a < d$
时间: 2023-09-02 12:12:41 浏览: 69
好的,下面是用 C++ 解决这个问题的代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, a, b, c, d;
cin >> n >> a >> b >> c >> d;
vector<int> A(n);
A[0] = a;
for (int i = 1; i < n; i++) {
A[i] = (A[i - 1] * A[i - 1] + b * A[i - 1] + c) % d;
}
int ans = 0;
int x = A[0];
for (int i = 0; i < n - 1; i++) {
ans ^= x * (i + 1);
x ^= A[i + 1];
}
ans ^= x * n; // 最后一次异或
cout << ans << endl;
return 0;
}
```
这个程序首先读入输入数据,然后使用 `vector` 存储生成的数组 $A$。接着使用变量 `ans` 和 `x` 分别表示当前的异或和和当前的 $a_1 \times (j + 1)$。在循环中,我们从第一个元素开始,依次计算 $a_1 \times (j + 1)$ 并将其与当前的异或和进行异或,然后更新 `x` 的值。最后,我们还需要计算一遍最后一次异或,将其与 `ans` 进行异或并输出即可。
由于 $n$ 的范围比较大,因此我们需要使用 `vector` 来存储数组 $A$,否则可能会导致内存溢出。时间复杂度为 $O(n)$,可以通过本题。
阅读全文